关于pthread_cond_signal和pthread_cond_wait

时间:2011-06-28 11:17:28

标签: c linux pthreads

我对 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);
}

2 个答案:

答案 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,控制流很难弄明白。