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

4

1 回答 1

3

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

GCCstd::thread曾经有一个类似的错误,因为我们曾经std::bind实现它,但我用std::bind不同的实现细节替换了使用,该细节将捕获的参数按值转发给函数。

于 2013-07-25T13:20:48.537 回答