3

メインから作成されているプロデューサーとコンシューマーのスレッドがあります。coutステートメントを除いて、それらは正しく機能します

class myclass{
int x;
// stuff
}

void foo1(myclass* ob){
setX(ob->x);
// stuff
}

void foo2(myclass* ob){

cout << ob->x << endl; // ONLY THIS DOESN'T EXECUTE

ob->getX();
// stuff
}

int main(){
myclass* ob = new myclass();
boost::thread producer_thread(boost::bind(foo1, ob));
boost::thread consumer_thread(boost::bind(foo2, ob));
// stuff

producer_thread.join();
consumer_thread.join();

}

すべて正常に動作します (cout を除いて、x を表示する showX を含みます。何が問題なのですか?

4

2 に答える 2

1

あなたのスレッドは、実際にはロックせずにオブジェクトを共有しています。コンシューマーがオブジェクトへのアクセスを開始する前にプロデューサーが終了していません。これは、boost::thread consumer_thread(boost::bind(foo2, ob)) の前に producer_thread.join() を使用すると解決するはずですが、これは最善の修正ではありません。ミューテックス ロックを使用するのが理想的です。

于 2013-10-01T01:38:55.957 に答える
1

前の回答に加えて、状態変数または条件変数を使用して、他のスレッドが作業しているときにオブジェクトがスレッドによって書き込まれたり処理されたりしないようにすることもできます。つまり、完了時に各関数によって値が一意の番号に変更される状態変数を持つことができ、状態変数が前の関数が設定するはずの値になると各関数が動作を開始します。

于 2013-10-05T01:15:32.150 に答える