关于pthread_cond_signal和pthread_cond_wait

我有关于pthread_cond_signalpthread_cond_wait的问题 。 例如,在下面的代码中,根据我的理解,当inc_count调用pthread_cond_signal时 ,只有在inc_count中的count_mutex被解锁之后, 能够执行watch_count中的 count + = 125

当执行pthread_cond_wait时, count_mutexwatch_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_LIMITCOUNT开始。)

顺便说一句:这段代码伤了我的头。 我真的不会建议在watch_count修改count ,因为如果您有多个线程运行该函数并且您开始使用pthread_cond_broadcast ,则控制流可能很难弄清楚。