私は、このようにboost::mutex::scoped_lock
を使用してきた:Boost scoped_lockがmutexのロックを解除しないのはなぜですか?
void ClassName::FunctionName()
{
{
boost::mutex::scoped_lock scopedLock(mutex_);
//do stuff
waitBoolean=true;
}
while(waitBoolean == true){
sleep(1);
}
//get on with the thread's activities
}
は、基本的にはwaitBooleanを設定し、これをfalseにwaitBooleanを設定することによって行われている他のスレッドシグナル;
しかし、他のスレッドがmutex_でロックを取得できないため、これは機能していないようです。
私はscoped_lockを角かっこで囲むことでロックを終了すると仮定していました。これはそうではありませんか?オンラインを読むと、デストラクタが呼び出されるときにだけmutexを放棄すると言われています。その地方の範囲から外れると、それは破壊されませんか?コードの一部をシグナリング
:
while(running_){
boost::mutex::scoped_lock scopedLock(mutex_);
//Run some function that need to be done...
if(waitBoolean){
waitBoolean=false;
}
}
ありがとう!
scoped_lockオブジェクトは閉じ括弧で破棄され、mutexは解放されます。コードのシグナル部分を投稿してください。 ところで、boost :: condition_variableはあなたのニーズに合っています – neuro
あなたのシグナリングコードを見ると、ある場合には動作しますが、あなたの処理(あなたのコメント)によって異なります。他のシンクロがあればそれは悪化する。条件変数はそれを行う方法です。この種のシンクロをするために使用するコードを投稿しました。 – neuro
シグナルスレッドの「仕事」は他のものをロックしません。それは独立して実行されます。 – Alex