したがって、同じ変数「カウンター」を共有する2つのスレッドがあります。両方のスレッドがその時点に到達したら、実行を継続することでスレッドを同期したいと考えています。残念ながら、スレッドがチェック変数を変更していないため、デッドロック状態になります。私が持っている方法は次のとおりです。
volatile int counter = 0;
Thread() {
- some calculations -
counter++;
while(counter != 2) {
std::this_thread::yield();
}
counter = 0;
- rest of the calculations -
}
アイデアは、2 つのスレッドがあるため、それらがそのポイントに達すると (異なる時間に)、カウンターをインクリメントするということです。カウンターが 2 に等しくない場合、最初にそこに到達したスレッドは、他のスレッドがカウンターをインクリメントして同期されるまで待機する必要があります。ここで問題がどこにあるか知っている人はいますか?
この問題についてさらに詳しい情報を追加するために、配列に対する操作の半分を実行する 2 つのスレッドがあります。それらが完了したら、両方が計算を完了したことを確認したいと思います。それらが完了したら、プリンター スレッドに信号を送信してウェイクアップし、配列の印刷とクリアの操作を実行できます。両方のスレッドが完了する前にこれを行うと、問題が発生します。
擬似コード:
Thread() {
getLock()
1/2 of the calculations on array
releaseLock()
wait for both to finish - this is the issue
wake up printer thread
}