Комментарий (не ответ):
Это то, что вы имеете в виду?
Global:
// protected by 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);
{ // locked region
about_to_pthread_cond_wait = true;
while (condition_waited_on) {
// pthread_cond_wait (&m, &c) is decomposed here:
__pthread_mutex_cond_wait_then_unlock (&m, &c);
// unlocked region
pthread_mutex_lock (&m);
}
}
pthread_mutex_unlock (&m);
Резьба B:
for (bool break_loop = false; !break_loop;) {
pthread_mutex_lock (&m);
{ // locked region
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 ();
}
EDIT:
Я полагаю, 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);
{ // locked region for c.int_state
__register_wakeup_cond (&c.int_state);
pthread_mutex_unlock (&m);
}
pthread_mutex_unlock (&c.int_mutex);
// will not touch c.int_state any more
__sleep_until_registered_wakeups ();
и pthread_cond_signal
делает:
pthread_mutex_lock (&c.int_mutex);
{ // locked region for CV internal state
__wakeup_registered (&c.int_state);
}
pthread_mutex_unlock (&c.int_mutex);
Тогда pthread_cond_destroy
будет вызываться только после того, как __pthread_mutex_cond_wait_then_unlock
завершится с использованием c.int_state
.