我目前一直在研究并发对象,基于 Herb Sutter's presentation .我目前正在使用带有 November CTP 的 Visual Studio 2012(无法以另一种方式检查下面的内容,Clang 不喜欢 decltypes 中的类成员,g++ 不喜欢 Windows 上的任何东西)。
这样做时,我遇到了一个线程 ID 为 -1 的奇怪错误。 考虑以下代码:
__workerThread([=]() -> void {
std::cerr << std::endl;
while (!__done)
{
this->__innerqueue.pop()();
}
})
这只是一个带有 lambda 函数的 std::thread
的初始化——没什么了不起的,我想。
但是如果没有强制调用 std::cerr 的第一行(没有优化),这个线程的 id 似乎是 -1(由于调试器),否则,它应该是。
执行时出现这个线程ID的问题
std::unique_lock<std::mutex> lock(this->__accessMutex);
在message-queue里面,因为它在较低的 API (mutex.c) 的某处崩溃。
有没有人知道是什么导致了这种奇怪的行为?添加对 std::cerr
的调用目前只是一个令人讨厌的解决方法,我想摆脱它......
您可以在 Github 找到完整的源代码如果你想玩它。
最佳答案
它看起来像一个初始化程序问题。线程在并发队列完全创建之前运行(竞争)。 std::cerr
可能会延迟线程足够长的时间以使其工作。
尝试交换两行:
std::thread __workerThread;
mutable concurrent::queue<std::function<void()>, std::queue> __innerqueue;
交换应该在线程之前创建 __innerqueue
,它应该像宣传的那样工作。
关于c++ - 什么可能导致线程 ID 为 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965001/