1

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();
...
4

2 に答える 2

2

さらに、mymutex.lock()のようなものと、boost :: mutex :: scoped_lock scopedLock(mutex_);のような呼び出しの違いを理解したいと思います。またはunique_lock。

Google for "c ++ RAII":

あなたと一緒mymutex.lock()にミューテックスを「手動で」ロックしています。(後で「手動で」ロックを解除する必要があります。)

scoped_lockは、ロック(およびスコープの最後での自動ロック解除)を実行するヘルパークラスです。

于 2011-05-10T19:48:43.760 に答える
1
boost::mutex::scoped_lock mutex2lock(mutex2);

私が正しく理解していれば、これははずですが、Mutexの長さだけ続くmutex2の大きなロックです。

2番目のスレッドのコンテキスト内でそのロックが必要になる可能性がありますが、condition_variableがなぜそれを必要とするのかよくわかりません。

実際、ドキュメントを読んで、condition_variable自体はあなたがしていることに少し間違っているようです:

原子的にlock.unlock()を呼び出し、現在のスレッドをブロックします。this-> notify_one()またはthis-> notify_all()の呼び出しによって通知されたとき、または誤ってスレッドのブロックが解除されます

その説明は、実行できると感じたときにロックを解除できるように思えます(おそらく時間に基づいています)リストが有効かどうかを確認する必要があるようです。有効でない場合は、計画している場合はもう一度待機してくださいcondition_variableを使用します。

于 2011-05-10T20:34:34.023 に答える