根据Herb Sutter 的介绍,我目前一直在玩并发对象。我目前正在使用带有 11 月 CTP 的 Visual Studio 2012(无法以另一种方式检查下面的内容,Clang 不喜欢 decltypes 中的类成员,g++ 不喜欢 Windows 上的任何东西)。
这样做,我遇到了一个奇怪的错误,线程 ID 为 -1。考虑以下代码:
__workerThread([=]() -> void {
std::cerr << std::endl;
while (!__done)
{
this->__innerqueue.pop()();
}
})
这只是std::thread
带有 lambda 函数的 a 的初始化——我想,没什么了不起的。但是如果没有第一行强制调用 std::cerr (没有优化),这个线程的 id 似乎是 -1 (由于调试器),否则,它应该是。
执行时出现此线程ID的问题
std::unique_lock<std::mutex> lock(this->__accessMutex);
在message-queue内部,因为它在较低的 API (mutex.c) 中的某个地方崩溃。
有没有人知道可能导致这种奇怪行为的原因?目前添加调用std::cerr
只是一个讨厌的解决方法,我想摆脱它......
如果您想使用它,可以在Github上找到完整的源代码。