コメント (未回答):
それはあなたが念頭に置いていることですか?
グローバル:
// m によって保護されています:
pthread_mutex_t m;
pthread_cond_t c;
bool about_to_pthread_cond_wait = false;
bool condition_waited_on = false;
スレッド A:
pthread_mutex_lock (&m);
{ // ロックされた領域
about_to_pthread_cond_wait = true;
while (condition_waited_on) {
// pthread_cond_wait (&m, &c) は次のように分解されます:
__pthread_mutex_cond_wait_then_unlock (&m, &c);
// ロックされていない領域
pthread_mutex_lock (&m);
}
}
pthread_mutex_unlock (&m);
スレッド B:
for (bool break_loop = false; !break_loop;) {
pthread_mutex_lock (&m);
{ // ロックされた領域
condition_waited_on = true;
if (about_to_pthread_cond_wait) {
pthread_cond_signal (&c);
pthread_cond_destroy (&c);
break_loop = true;
}
}
pthread_mutex_unlock (&m);
pthread_yield ();
}
編集:
私はそうすると思いpthread_cond_wait (&m, &c);
ます:
__pthread_mutex_cond_wait_then_unlock (&m, &c);
pthread_mutex_lock (&m);
__pthread_mutex_cond_wait_then_unlock
CVへの信号を監視し、ミューテックスのロックを解除してからスリープ状態になります。
CV に内部ミューテックスが__pthread_mutex_cond_wait_then_unlock
あり、内部pthread_cond_signal
でロックする必要がある場合は、次のように仮定__pthread_mutex_cond_wait_then_unlock
します。
pthread_mutex_lock (&c.int_mutex);
{ // c.int_state のロックされた領域
__register_wakeup_cond (&c.int_state);
pthread_mutex_unlock (&m);
}
pthread_mutex_unlock (&c.int_mutex);
// c.int_state にはもう触れません
__sleep_until_registered_wakeups ();
そして、次のことをpthread_cond_signal
行います:
pthread_mutex_lock (&c.int_mutex);
{ // CV 内部状態の領域をロック
__wakeup_registered (&c.int_state);
}
pthread_mutex_unlock (&c.int_mutex);
Thenは の使用が終了したpthread_cond_destroy
後にのみ呼び出されます。__pthread_mutex_cond_wait_then_unlock
c.int_state