我对 pthread_cond_signal 和 pthread_cond_wait 有疑问。例如,在下面的代码中,根据我的理解,当 inc_count 在 watch_count 中调用 pthread_cond_signal 时,计数+ = 125 strong>只有在 count_mutex 在 inc_count 中解锁后才能执行。
执行 pthread_cond_wait 后, count_mutex 在 watch_count 中解锁,并且仅在 pthread_mutex_unlock 后被锁定inc_count 已执行。我是对的吗?
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);
}
答案 0 :(得分:5)
pthread_cond_wait()
在进入时解锁互斥锁并在退出时再次锁定它。如果另一个线程在此期间获得锁定,则pthread_cond_wait()
在其他线程释放锁定之前无法返回。
因此,如果在watch_count()
中阻止了pthread_cond_wait()
,并且inc_count()
运行并调用pthread_cond_signal()
,那么watch_count()
将不会从pthread_cond_wait()
返回直到inc_count()
调用pthread_mutex_unlock()
。
但是,即使未发出信号,pthread_cond_wait()
也可以唤醒。这被称为虚假唤醒。因此,watch_count()
可以执行count+=125
多次,即使inc_count()
从未运行,也从不调用pthread_cond_signal()
。
答案 1 :(得分:0)
只有在inc_count中解锁count_mutex后才能执行watch_count中的count + = 125
是。
当执行pthread_cond_wait时,count_mutex在watch_count中解锁,并且仅在执行inc_count中的pthread_mutex_unlock后才被锁定。
是的,从某种意义上说,pthread_cond_wait
返回watch_count
时会保留互斥锁,因此它只会在inc_count
解锁互斥锁后返回。 (首次到达COUNT
时,COUNT_LIMIT
提供while
以下。
count
中的watch_count
,因为如果你有多个线程运行该函数并且你开始使用pthread_cond_broadcast
,控制流很难弄明白。