评论(不回答):
这就是你的想法吗?
全球的:
// 受 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;
而(条件_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 = 真;
如果(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);
然后pthread_cond_destroy
只会在__pthread_mutex_cond_wait_then_unlock
使用完毕后调用c.int_state
。