1

質問は、私が一瞥した条件変数に関する投稿についてです。条件変数

作者は最初にバグのある例を挙げます:

/* in thread 1 */
pthread_mutex_lock(mx); 
if (state == GOOD) {
    pthread_mutex_unlock(mx);  // Here !
    wait_for_event();
    pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);


/* in thread 2 */
pthread_mutex_lock(mx);
state = GOOD;
pthread_mutex_unlock(mx);
signal_event(); /* expecting to wake thread 1 up */

そして次のように説明します:

'この擬似コードのサンプルにはバグがあります。スケジューラーが、pthread_mutex_unlock(mx)の後、wait_for_event()の前に、コンテキストをスレッド1からスレッド2に切り替えることを決定した場合はどうなりますか。この場合、スレッド2はスレッド1をウェイクアップせず、スレッド1はおそらく永久にスリープ状態を継続します。

著者が後で同じ投稿で示したように、私は条件変数がどのように使用されるべきかを知っています。

このバグのある例では、「state ==GOOD」の判断と「wait_for_event()」がミューテックスによって全体としてロックされていないことがわかります。そして、スレッド1が最初の' pthread_mutex_unlock(mx);の直後にコンテキストスイッチされた場合。'、スレッド2は'状態'を他の何か(悪い?)に変更し、スレッド1をウェイクアップして'状態==GOOD'ロジックに進むように信号を送ることができます。これは間違っていると思います。

しかし、なぜ作者は「この場合、スレッド2はスレッド1をウェイクアップせず、スレッド1はおそらく永久にスリープ状態を継続します。」と言います。

'signal_event();'ではありません まだスレッド2で呼び出されていますか?私の理解はまったく正しかったですか?

4

1 に答える 1

0

signal_event()このバグは、とのセマンティクスが原因で発生しwait_for_event()ます。signal_event()誰も立ち往生していないときに呼び出された場合、wait_for_event()信号は失われます。

コンテキストスイッチに加えて、スレッド2が高速で実行され、スレッド1が低速の場合にも同じ問題が発生します。その場合、スレッド1の時間

pthread_mutex_unlock(mx);

wait_for_event();

thread2がすべての操作を実行し、シグナルを忘却に送信する場合があります(誰もそれを待っていないため)。次に、スレッド1が待機し、シグナルを取得することはありません(何らかの理由でスレッド2が再度実行されない限り)。

于 2012-10-10T09:26:04.430 に答える