以下代码(在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();
}
}
我正在寻找一种检查从指定线程调用函数的方法。
答案 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();
}
}