これが些細な質問である場合は申し訳ありません。しかし、私はどこにも答えを見つけることができませんでした。pthreads を使用するプログラムを作成しています。1 つのスレッドがロック (ミューテックス) を取得し、データを同期バッファーにプッシュしようとします。バッファには、 push()メソッドが呼び出されると取得される独自のミューテックスがあります。
バッファーがいっぱいで、スレッドが条件変数で待機する必要がある場合、待機呼び出しは取得したすべてのロックを解放しますか? それとも、条件変数に関連付けられたもの (たまたま最後に取得されたロック) を解放するだけですか? 後者の場合、別のスレッドが最初のロックを取得する必要がある場合、どうすればデッドロックを回避できますか?
編集:
私が抱えている問題は次のとおりです。AとBという 2 つのスレッドがあります。スレッドAには、多数のバッファにデータを挿入するforループがあります。反復ごとに要素がバッファの 1 つに挿入されます。これはスレッドであるため、スレッドの別の外側のループ内でこのループを継続的に実行します。Bがアクティブになると、これらのバッファーを操作します。ただし、 forループの実行中にAがスケジューラによって中断された場合、 Bはバッファを操作してはなりません。したがって、ミューテックスを使用して、forループであるAのクリティカル セクションをロックします。
編集-2:
私はそれにいくつかの考えを与えてきました。そして、私の問題に対する答えは、バッファの条件変数が最初のロックも解放するということではありません。つまり、最初のロックはそもそも必要ありませんでした。バッファからの要素の削除を担当するコンシューマ スレッド (スレッドBとは異なります) が適切にジョブを実行している場合、スレッドAはある時点で再開し、forループは完了します。したがって、私の問題はそこにあるに違いありません。詳しく見て更新していきます。