c++ - 什么可能导致线程 ID 为 -1?

标签 c++ c++11 mutex stdthread

我目前一直在研究并发对象,基于 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/

相关文章:

c++ - lambda 的默认捕获是什么?

c++ - 正确的线程调用语法?错误:没有对 std::thread::thread(<brace-enclosed initializer list>) 的匹配调用

c - getter 方法的互斥量导致死锁

c++ - [basic.execution] p5 句子 2 的意图

c++ - 允许复制列表初始化和显式构造函数吗?

c++ - 在函数内访问调用成员函数的对象

c++ - 如何修复 Werror=parentheses(建议在赋值周围使用括号)错误?

c++ - 为什么 sleep 功能会禁用我的互斥体

c - 调用 trylock() 后解锁互斥量

c++ - 复制构造函数