15

条件変数を使用する一般的な方法を次に示します。

// The reader(s)
lock(some_mutex);
if(protected_by_mutex_var != desired_value)
    some_condition.wait(some_mutex);
unlock(some_mutex);

// The writer
lock(some_mutex);
protected_by_mutex_var = desired_value;
unlock(some_mutex);
some_condition.notify_all();

しかし、protected_by_mutex_var がたとえばコンペア アンド スワップ命令によってアトミックに設定されている場合、ミューテックスは何らかの目的を果たしますか (pthread やその他の API でミューテックスを渡す必要があること以外に)? 条件を実装するために使用される保護状態ですか?そうでない場合、これを行うのは安全ですか?:

// The writer
atomic_set(protected_by_mutex_var, desired_value);
some_condition.notify_all();

ライターがリーダーのミューテックスと直接対話することはありませんか? 'protected_by_mutex_var' という名前はもはや適切ではないことに注意してください (もはやミューテックス保護ではありません)。もしそうなら、異なるリーダーが同じミューテックスを使用する必要さえありますか?

4

1 に答える 1

14

次のシナリオを想像してください。

| Thread 1                                            | Thread 2                                           |
| if(protected_by_mutex_var != desired_value) -> true |                                                    |
|                                                     | atomic_set(protected_by_mutex_var, desired_value); |
|                                                     | some_condition.notify_all();                       |
| some_condition.wait(some_mutex);                    |                                                    |

この状況では、スレッド 1 が、決して来ない可能性がある通知を待機しています。条件に作用するステートメントは変数の読み取り/アトミック セットの一部ではないため、競合状態が発生します。

ミューテックスを効果的に使用すると、これらのアクションを分離できなくなります (変数へのすべてのアクセスが適切に動作し、ミューテックスをロックすると仮定します)。

于 2010-03-27T23:55:51.457 に答える