2017-11-02 23 views
0

私はboost :: refを使ってスレッドに渡すポインタ(オブジェクト)のベクトルを持っていて、そのスレッドでオブジェクトのいくつかの変数を変更します。メインスレッドに戻ると、スレッドで加えられた変更は適用されず、デフォルト値になります。私はこれをデバッグして、スレッドで変更されますが、メインスレッドでは変更されていません。これは、boost :: refが機能しておらず、パラメータが値渡しされているかのようです。別のスレッドで変更したときに変数が変更されないのはなぜですか?

私が間違っていることを誰かに見せてもらえますか?

std::vector<Chunk *> chunks = divideScreen(width, height, chunkSize); 

for (Chunk * chunk : chunks) { 
    chunk->changed = 1; //initial value is 0, change it to 1 before passing to thread 
    boost::thread chunkThread = boost::thread(boost::bind(&Renderer::render, this, boost::ref(chunk))); 
} 

//wait for threads to finish 


//back in main thread 
std::cout << chunks[0]->changed << endl; //prints 1 


void Renderer::render(Chunk * chunk) { 
    chunk->changed = 2; //should be 2 - prints 2 in thread 
} 
+0

私は、あなたがポインタへの参照が必要だと思っている理由を理解している[mcve] – user463035818

+1

btwを提供してください。 – user463035818

+0

"スレッドが完了するのを待つ" 。スレッド上で常に 'chunkThread.join()'または 'chunkThread.detach()'を呼び出す必要があります。私の推測が正しくない場合は、完全な例を提供してください。 – Ptaq666

答えて

2

あなたは、スレッドにもはやforループを抜けた後「が存在」しchunk変数への参照を与えます。

スレッドがいくつかの値を変更しているのを見るかもしれませんが、実際にはある変数chunkが逆参照され、(予測不可能な)内容をポインタとして使用して、changedのメモリの場所が変更されます。

refとしないでください。スレッドはポインタを保持する変数ではなく、実際のポインタを必要とします。

+0

それは、ありがとう! – user

+0

すごくいいよ。作業を他のスレッドに委譲するときは、参照を避けてください(ラムダキャプチャと同じ)。 – xtofl

関連する問題