Boostライブラリを使用して(同じC ++マップで動作する)2つのスレッドを同期しようとしています。私はC++の専門家ではなく、ブーストのドキュメントを理解するのは非常に難しいと言わなければなりません。
私が達成したいのは、次のようなものです。
#Thread 1
get access to the map
put in something
release access
#Thread 2
wait until map is empty
when it's not empty anymore, wake up and gain access
perform operations on one entry of the map
leave access to somebody else
Mutexとcondition_variablesを使用しようとしましたが、コードが正しく機能していませんでした。具体的には、thread2がウェイクアップしているとき(cond。変数を待機した後)、マップに直接アクセスすることはできませんでしたが、他の誰かがアクセスしてマップを空にしました。そのため、アクセスしたときにマップが空のときにマップがいっぱいになると予想していたため、セグメンテーション違反が発生しました。
さらに、次のようなものと次のような呼び出しの違いを理解したいmymutex.lock()
と思いboost::mutex::scoped_lock scopedLock(mutex_)
ます。またはunique_lock
。
教えてくれてありがとう:)
編集:ここで私は自分のコードの関連部分を抽出しようとしました。同期がどのように機能するかよく理解していなかったので、あまり意味がないかもしれません...
//COMMON PART
boost::mutex mutex1;
boost::mutex mutex2;
boost::condition_variable cond;
boost::mutex::scoped_lock mutex2lock(mutex2);
//THREAD 1
...
if(someCondition){
mutex1.lock();
map[id]=message;
cond.notify_one();
mutex1.unlock();
}
...
//THREAD 2
...
cond.wait(mutex2lock);
mutex.lock();
//Perform operation on map[id]
doSomething(map[id]));
mutex.unlock();
...