次のコードスニペットを考慮してください。 GCC 4.6.1を使用すると、x
は0
になり、y
は1
になります。C++ 11スレッドパズル内のファンクタ
別のスレッドを使用する場合と使用しない場合で異なる結果が得られるのはなぜですか?どちらのバージョンでも同じ結果が得られるようにコードを変更する必要があります(つまり、整数値が1ずつ増えます)。
ありがとうございました。
struct functor{
void operator()(int & x){
++x;
}
};
void tfunc(functor & f, int & x){
f(x);
}
int main(){
functor f;
int x = 0, y = 0;
std::thread t = std::thread(tfunc, f, x);
t.join();
std::cout << "with thread " << x << std::endl;
f(y);
std::cout << "without thread " << y << std::endl;
}
'x'をvolatileにしてみてください。 'std :: thread'が作成された後、' join'が返る前にコンパイラがその値をフェッチすることは合法です。 – spraff
@spraff: 'volatile'は適切な同期の代用ではありません(これは同期の問題ではありません)。 –
UPDATE。 'int *'が 'int 'の代わりに' tfunc'に渡された場合に動作します。 Tres bizarre。 – user92382