condition_variable抛出system_error与Xcode - fine与VStudio
condition_variable throwing system_error with Xcode - fine with VStudio
每次我在Xcode编译时尝试等待我的condition_variable时都会出现错误。错误是"以未捕获的异常类型std::__1::system_error: condition_variable wait failed: Invalid argument结束"
在Visual Studio 2013中一切正常。如果我决定不等待来自多个线程的同一个condition_variable,代码就可以工作。Grrrr .
好的,代码。
main.cpp:
#include "ThreadPool.h"
int main(int argc, const char * argv[])
{
ThreadPool pool;
for (int i = 0; i < 10; ++i)
pool.sendWork();
std::this_thread::sleep_for(std::chrono::milliseconds(50000));
return 0;
}
ThreadPool.h
#pragma once
#include <condition_variable>
#include <vector>
#include <thread>
class ThreadPool
{
protected:
std::condition_variable _condition;
private:
std::vector<std::thread> _threads;
void threadLoop();
public:
ThreadPool();
void sendWork();
};
ThreadPool.cpp:
#include "ThreadPool.h"
ThreadPool::ThreadPool()
{
for (unsigned int i {0}; i < 10; ++i)
_threads.push_back(std::thread(&ThreadPool::threadLoop, this));
}
void ThreadPool::threadLoop()
{
std::mutex mutex;
std::unique_lock<std::mutex> lock {mutex};
_condition.wait(lock); // This is where the crash happens
}
void ThreadPool::sendWork()
{
_condition.notify_one();
}
这是对实际代码的主要简化,但它足以触发崩溃。
这应该工作吗?我遗漏了什么吗?
更准确地说,condition_variable::wait()
规范的Requires部分是(N3936§30.5.1 [thread.condition.condvar]/p9):
因此,每个并发等待void wait(unique_lock<mutex>& lock);
要求:
lock.owns_lock()
为true
,lock.mutex()
为锁定by调用线程,或者-没有其他线程正在等待这个
condition_variable
对象或-
lock.mutex()
对所有并发提供的锁参数返回相同的值等待(通过wait
、wait_for
或wait_until
)线程。
condition_variable
的线程必须传入同一个互斥锁。从技术上讲,允许两个线程使用一个互斥锁等待一个condition_variable
,然后在两个等待都结束后(并且没有线程在等待condition_variable
),它们都使用不同的互斥锁等待同一个对象。我不知道这是否有任何现实的用例。
还请注意std::condition_variable_any::wait()
没有这样的要求。对所提供类型的唯一要求是它满足BasicLockable
要求,这基本上意味着它具有lock()
和unlock()
。
ThreadPool::threadLoop
中的互斥锁是一个局部变量。这意味着不同的线程锁在不同的互斥锁上。这是无效的:条件变量绑定到一个特定的互斥锁,你必须在等待条件之前为这个互斥锁获取一个锁。
您应该在您的ThreadPool
类中声明一个_mutex
(或者,更好的是使用mutex_
命名约定:下划线前缀标识符大多是保留的)成员变量,并始终锁定
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- Xcode 语义问题引用或以前定义的代码
- 使用 Xcode 将双精度存储在数组C++中
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- Qt - 从XCode上传到MacOS AppStore
- 在 xcode 10 上找不到 stdlibc++ 标头错误
- cmake add_custom_command + Xcode:多输出 = 多命令调用
- 在 xcode 上使用 stdlib.h
- 我可以在没有Xcode的情况下在Mac上使用带有C++的虚幻引擎吗?
- 为什么不支持 Xcode 1.5?
- C++ Xcode 9 - 无法从 Cimg 调用函数 display()
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 如何将 PhysX 库与 Xcode 链接
- Xcode Test Navigator 如何在纯C++项目中显示 Google 测试
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- condition_variable抛出system_error与Xcode - fine与VStudio