为什么这个帖子不知道它是谁?

时间:2016-10-29 18:09:22

标签: c++ multithreading c++11

以下代码(在Visual Studio 2013下)在断言中失败。有人可以解释为什么会这样吗?

#include <thread>
#include <cassert>

std::thread t;

void threadTask()
{
   assert(t.get_id() == std::this_thread::get_id());
}

int main()
{
    for (int i = 0; i < 1000; ++i)
    {
        t = std::thread(threadTask);
        t.join();
    }
}

我正在寻找一种检查从指定线程调用函数的方法。

1 个答案:

答案 0 :(得分:7)

线程可以在std::thread构造函数退出回调用者之前开始运行,因此在为assert()变量分配新值之前可能会调用t。在第一次循环迭代中,这意味着t可能是未定义的。在后续迭代中,这意味着t仍然可以引用前一个线程。

线程需要等到t分配一个值才能可靠地使用t。例如,使用t保护std::mutex

#include <thread>
#include <mutex>
#include <cassert>

std::thread t;
std::mutex m;

void threadTask()
{
   {
   std::lock_guard<std::mutex> l(m);
   assert(t.get_id() == std::this_thread::get_id());
   }
   ...
}

int main()
{
    for (int i = 0; i < 1000; ++i)
    {
        {
        std::lock_guard<std::mutex> l(m);
        t = std::thread(threadTask);
        }
        t.join();
    }
}