2 つのスレッド A、B が定期的に 2 つのグローバル センサー読み取り変数を更新し、同じルーチンを実行します。そして 3 番目のスレッド C は、それらの値が更新されるとすぐにそれらの値に対して何らかの計算を行います。A と B の両方がグローバル変数を更新すると、C がすぐに読み取るように条件変数を設定しました。新しいA、Bの更新後にループのポーリングが配置されている間にスレッドCがセンサーの読み取りを逃したのではないかと心配しています。私はpthreadの初心者なので、心配が必要かどうかはわかりません。私の開発環境は組込み Linux ボードで、現在 pthread を学んでいます。グローバル変数ごとに 2 つの条件変数を設定するよりも良い方法はありますか。
2 に答える
1 つのミューテックス、1 つの条件変数、および 1 つの述語整数生成カウンター (ゼロに初期化された通常の整数) を使用します。ロジックは次のように機能します。
値を更新するには: ミューテックスをロックします。値を更新します。述語整数をインクリメントします。条件変数をブロードキャストします。ミューテックスを解放します。
現在の値を読み取るには: ミューテックスをロックします。述語整数生成カウンターの値のコピーを作成します。値を読み取ります。ミューテックスを解放します。
新しい値を確認するには: ミューテックスをロックします。最後に値を読み取ったときにコピーした値に対して、述語の整数を確認します。違うなら新しい価値がある。ミューテックスを解放します。
新しい値を待つには: ミューテックスをロックします。述語整数は、最後に値を読み取ったときに保持されていた値を保持している間、ミューテックスを解放する条件変数をブロックします。次の待機のために新しい述語整数をコピーします。新しい値に注意してください。ミューテックスを解放します。
他のオプションは、単純なミューテックスです。
pthread_mutex_t lockX = PTHREAD_MUTEX_INITIALIZER;
[...]
pthread_mutex_lock(lockX);
// do things with shared variable
pthread_mutex_unlock(lockX);
これは読み取りと書き込みに適用されます。単一の int を使用しても、スレッド A が値の半分を読み取り、次にスレッド B が同じ変数に書き込み、スレッド B が残りの半分を読み取り続け、結果として「値」になる可能性があるためです。これは決して存在しませんでした。
ところで、スレッドでグローバルを使用する必要はありません。スレッド関数には、その中に何でもある構造体ポインターを渡すことができます。