通过引用传递给VS2012中的std :: thread c ++ 0x

时间:2013-07-25 12:57:25

标签: c++11 stdthread

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。知道为什么没有标记这个吗?

1 个答案:

答案 0 :(得分:3)

这是一个VC11错误,thread对象生成参数的内部副本(应该如此)但是它没有正确地将它们转发到ThreadFn函数,所以会发生什么reference绑定到thread对象的内部int成员。

GCC的std::thread曾经有过类似的错误,因为我们使用std::bind来实现它,但是我将std::bind替换为使用不同的实现细节,将捕获的参数转发给按价值运作。