2種類のデータ更新に、2つのミューテックスに関連付けられた1つの条件変数を使用してもいいですか。
基本的に、スレッド1とスレッド2があります。Thread1 は 2 種類のデータ更新を待機できるため、それぞれに 1 つずつ、2 つのミューテックスを取得しました。(これらすべてのデータに対して 1 つのミューテックスを使用できることはわかっていますが、これはこの質問のポイントではありませんよね?) そして、data2 が既に利用可能である間に data1 を待機させたくないので、条件変数は 1 つしか取得しませんでした。 . また、thread2 は data1 と data2 の両方を提供します。問題は、thread2 では、thread1 が現在 data1 または data2 を待機しているか、まったく待機していないかがわからないことです。
擬似コードは次のようになります。
global data:
cond_var
mutex1
data1
mutex2
data2
thread1:
while true
lock1.lock(mutex1)
if data1 is not available
cond_var.wait(lock1)
if data1 is available
process data1
lock1.unlock()
lock2.lock(mutex2)
if data2 is not available
cond_var.wait(lock2)
if data2 is available
process data2
lock2.unlock()
thread2:
func1:
lock1.lock(mutex1)
update data1
cond_var.notify_all()
lock1.unlock()
func2:
lock2.lock(mutex2)
update data2
cond_var.notify_all()
lock2.unlock()
外部は func1 または func2 を呼び出してデータを更新します。func1 または func2 が呼び出されると、lock1 または lock2 にあるかどうかに関係なく、cond_var が通知されます。cond_var の待機は while で囲まれていないため、cond_var が lock1 で起こされたが data2 が使用可能な場合、thread1 は data2 の処理に進みます。
実際の実装はboost::threadを介しており、私のテストのプラットフォームはLinuxなので、boost::threadはpthreadを介して実装する必要があります。
条件変数について読んだほとんどすべてのチュートリアルとドキュメントでは、1 つのミューテックスのみに関連付けられています。したがって、上記のプログラムが使用しても問題ないのか、それとも根本的に欠陥があるのか知りたいです。