オペレーティングシステムのプロセスの同期における条件変数の原則は何ですか?
8833 次
1 に答える
14
条件変数を使用すると、特定の条件が発生するのを待つことができます。実際には、スレッドは条件変数でスリープし、他のスレッドがそれをウェイクアップする場合があります。
条件付き変数には通常、ミューテックスが付属しています。これにより、次の同期の問題を解決できます。ミューテックスで保護されたデータ構造の状態を確認し、状態が別の状態に変わるまで待つにはどうすればよいですか。つまり
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_mutex_unlock(mx);
wait_for_event();
pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
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はおそらく永久にスリープ状態を継続します。
条件変数は、スリープ前にミューテックスをアトミックにロック解除し、ウェイクアップ後にアトミックにロックすることでこれを解決します。動作するコードは次のようになります。
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_cond_wait(cond, mx); /* unlocks the mutex and sleeps, then locks it back */
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
state = GOOD;
pthread_cond_signal(cond); /* expecting to wake thread 1 up */
pthread_mutex_unlock(mx);
それが役に立てば幸い。
于 2011-04-21T23:23:31.083 に答える