void ThreadFn(int& i)
{
cout<<"Hi from thread "<<i<<endl;
}
int x = 0;
void CreateThreads(vector<thread>& workers)
{
for(int i = 0; i< 10; i++)
{
workers.push_back(thread(&ThreadFn, x));
}
}
我期待线程创建(workers.push_back(thread(&ThreadFn, x));
)中出现编译错误,因为x
应该由ref传递。
我虽然正确的语法应该是:
workers.push_back(thread(&ThreadFn, std::ref(x)));
当然,代码编译得很好并且行为也正常。我正在使用VC11
。知道为什么没有标记这个吗?
答案 0 :(得分:3)
这是一个VC11错误,thread
对象生成参数的内部副本(应该如此)但是它没有正确地将它们转发到ThreadFn
函数,所以会发生什么reference绑定到thread
对象的内部int
成员。
GCC的std::thread
曾经有过类似的错误,因为我们使用std::bind
来实现它,但是我将std::bind
替换为使用不同的实现细节,将捕获的参数转发给按价值运作。