0

根据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上找到完整的源代码。

4

1 回答 1

3

它看起来像一个初始化程序问题。线程在并发队列完全创建之前运行(竞争)。可能会延迟线程足够长的std::cerr时间以使其工作。

尝试交换两行:

std::thread __workerThread;
mutable concurrent::queue<std::function<void()>, std::queue> __innerqueue;

交换应该__innerqueue在线程之前创建,它应该像宣传的那样工作。

于 2013-02-20T13:33:36.587 回答