同じをロックしようとしている 2 つのスレッドがありboost::mutex
ます。これらのスレッドの 1 つは継続的に一部のデータを処理しており、もう 1 つは定期的に現在の状態を表示しています。私の意図によると、処理スレッドは非常に頻繁にロックを解放して再取得するため、表示スレッドは必要なときにいつでもロックをタップして取得できます。したがって、明らかに、次にプロセス スレッドによってロックが解放されたときに、ディスプレイ スレッドがロックを取得するようにしたいと考えています。ただし、それは行わず、代わりにロックを待機し、プロセス スレッドからの多くのロック解放サイクルの後にのみロックを取得します。
私の問題を示す最小限の例を調べてください:
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
using namespace boost;
mutex mut;
void process() {
double start = time(0);
while(1) {
unique_lock<mutex> lock(mut);
this_thread::sleep(posix_time::milliseconds(10));
std::cout<<".";
if(time(0)>start+10) break;
}
}
int main() {
thread t(process);
while(!t.timed_join(posix_time::seconds(1))) {
posix_time::ptime mst1 = posix_time::microsec_clock::local_time();
cout<<endl<<"attempting to lock"<<endl;
cout.flush();
unique_lock<mutex> lock(mut);
posix_time::ptime mst2 = posix_time::microsec_clock::local_time();
posix_time::time_duration msdiff = mst2 - mst1;
cout << std::endl<<"acquired lock in: "<<msdiff.total_milliseconds() << endl;
cout.flush();
}
}
以下でコンパイル:g++ mutextest.cpp -lboost_thread -pthread
実行可能ファイルを実行すると、出力例は次のようになります。
...................................................................................................
attempting to lock
....................................................................................................................................................................................................................................................................................................................................................................................................................................
acquired lock in: 4243
...................................................................................................
attempting to lock
........................................................................................................
acquired lock in: 1049
...................................................................................................
attempting to lock
........................................................................................................................
acquired lock in: 1211
....................................
ご覧のとおり、最悪の場合、ディスプレイ スレッドは、ロックを取得するまでに 424 回のロックと解放のサイクルを待機します。
私は明らかにミューテックスを間違った方法で使用していますが、これを解決する通常の方法は何ですか?