我有关于pthread_cond_signal和pthread_cond_wait的问题 。 例如,在下面的代码中,根据我的理解,当inc_count调用pthread_cond_signal时 ,只有在inc_count中的count_mutex被解锁之后, 才能够执行watch_count中的 count + = 125 。
当执行pthread_cond_wait时, count_mutex在watch_count中被解锁,并且只有在inc_count中的 pthread_mutex_unlock被执行后才被locking。 我对吗?
void *inc_count(void *t) { int i; long my_id = (long)t; for (i = 0; i < TCOUNT; i++) { pthread_mutex_lock(&count_mutex); count++; if (count == COUNT_LIMIT) { pthread_cond_signal(&count_threshold_cv); } pthread_mutex_unlock(&count_mutex); } pthread_exit(NULL); } void *watch_count(void *t) { long my_id = (long)t; pthread_mutex_lock(&count_mutex); while (count < COUNT_LIMIT) { pthread_cond_wait(&count_threshold_cv, &count_mutex); count += 125; } pthread_mutex_unlock(&count_mutex); pthread_exit(NULL); }
pthread_cond_wait()
在进入时解锁互斥锁,并在退出时再次锁定它。 如果另一个线程在此期间获取了锁,那么pthread_cond_wait()
将不会返回,直到其他线程释放该锁。
因此,如果watch_count()
在pthread_cond_wait()
watch_count()
被阻塞,并且inc_count()
运行并调用pthread_cond_signal()
,则watch_count()
将不会从pthread_cond_wait()
返回,直到inc_count()
调用pthread_mutex_unlock()
。
但是,即使未发送信号, pthread_cond_wait()
也可以唤醒。 这被称为虚假唤醒。 因此,即使inc_count()
永不运行, inc_count()
也可以多次执行count+=125
次,或者永远不会调用pthread_cond_signal()
。
watch_count中的count + = 125只能在inc_count中解锁count_mutex后才能执行
是。
当执行pthread_cond_wait时,count_mutex在watch_count中被解锁,并且只有在inc_count中的pthread_mutex_unlock被执行后才被锁定。
是的,从某种意义上讲,当pthread_cond_wait
返回时, watch_count
持有互斥量,因此它只会在inc_count
解锁互斥量之后才会返回。 (当第一次到达COUNT_LIMIT
时COUNT
开始。)
顺便说一句:这段代码伤了我的头。 我真的不会建议在watch_count
修改count
,因为如果您有多个线程运行该函数并且您开始使用pthread_cond_broadcast
,则控制流可能很难弄清楚。