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));
    }
}

ref によって渡される必要があるため、スレッド作成 ( workers.push_back(thread(&ThreadFn, x));)でコンパイル エラーが発生することを予期していました。x正しい構文は次のようにする必要があります。

workers.push_back(thread(&ThreadFn, std::ref(x)));

もちろん、コードは正常にコンパイルされ、適切に動作します。を使用してVC11います。これがフラグされていない理由は何ですか?

4

1 に答える 1

3

これは VC11 のバグです。オブジェクトは引数の内部コピーを (本来あるべきように) 作成しますが、それらを関数に正しくthread転送しないため、参照がオブジェクトの内部メンバーにバインドされます。ThreadFnthreadint

GCCstd::threadには以前に実装していたため、同様のバグがありましたが、 の使用を、キャプチャされた引数を値によって関数に転送する別の実装の詳細std::bindに置き換えました。std::bind

于 2013-07-25T13:20:48.537 に答える