boost::thread が初めてなので、先日 BlockingQueue を書こうとしていました (私の意見では、これまでで最も実用的な同期構造です)。これは、セマフォまたは条件変数のいずれかを使用して達成されます。以前は両方とも Windows でそれぞれ Linux で実行されていましたが、boost は使用されていませんでした。
したがって、「モニター」が利用可能な言語 (ロック、待機、および通知を備えたもの) では、次のように使用します。
T BlockingQueue::take()
{
scopelock(monitor);
while (queue.empty())
monitor.wait();
T ret = queue.front();
queue.pop();
return ret;
}
私が言うことができることから、「モニター」はboost::mutexと連携してboost::condition_variable_anyを使用して達成されます。しかし、 condition_variable_any には既にミューテックスが含まれています! (internal_mutex と呼ばれます)。そのため、最初は condition_variable_any がモニター全体であると考えていましたが、結局のところ、ミューテックスは外部からアクセスできず、待機する前にロックすることはできません.
boost::condition_variable_any::internal_mutex の目的を知っている人はいますか? 私の場合、本当に混乱しました。 pthread_cond_t での待機は、ミューテックスをロックした状態で行う必要があることを知っていますが、どのミューテックスですか?? ありがとう。