このシナリオは常に頻繁に発生します。いくつかのスレッドと共有オブジェクトがあり、常に 1 つのスレッドだけがそのオブジェクトを変更できるようにする必要があります。
まあ、明らかな解決策はlock the door-do the job-get out of there
イディオムを使うことです。この状況では、私は常に POSIX ミューテックスを使用します。例えば
pthread_mutex_lock(&this->messageRW); // lock the door
P_Message x = this->messageQueue.front(); // do the job
this->messageQueue.pop();
pthread_mutex_unlock(&this->messageRW); // get out of there
// somewhere else, in another thread
while (true) {
P_Message message;
solver->listener->recvMessage(message);
pthread_mutex_lock(&(solver->messageRW)); // lock the door
solver->messageQueue.push(message); // do the job
pthread_mutex_unlock(&(solver->messageRW)); // get out of there
sem_post(&solver->messageCount);
}
私messageQueue
はコードの非常に多くの場所で使用しています。そのため、洗練されていないロック/ロック解除のペアがたくさんありました。messageQueue
スレッド間で共有されるはずのオブジェクトとして宣言する方法が必要だと思います。そうすれば、スレッド API がロック/ロック解除を処理できます。ラッパー クラスなどを考えることができます。POSIX ベースのソリューションが推奨されますが、他の API (ブースト スレッドや他のライブラリ) も使用できます。
同様の状況で何を実装しますか?
将来の読者のための更新
私はこれを見つけました。C++14 の一部になると思います。