【问题标题】:About pthread_cond_signal and pthread_cond_wait关于 pthread_cond_signal 和 pthread_cond_wait
【发布时间】:2011-06-28 11:17:28
【问题描述】:

我对 pthread_cond_signalpthread_cond_wait 有疑问。比如下面的代码,据我了解,当inc_count调用pthread_cond_signal时,count += 125 in watch_count 只有在 inc_count 中解锁了 count_mutex 后才能执行。

count_mutexpthread_cond_wait 执行时在 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);
}

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    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()

    【讨论】:

      【解决方案2】:

      watch_count 中的count += 125 只有在inc_count 中count_mutex 被解锁后才能执行

      是的。

      当 pthread_cond_wait 执行时,在 watch_count 中的 count_mutex 被解锁,并且只有在 inc_count 中的 pthread_mutex_unlock 被执行后才被锁定。

      是的,从某种意义上说,当pthread_cond_wait 返回时watch_count 持有互斥锁,因此它只会在inc_count 解锁互斥锁后返回。 (当第一次到达while 时,如果COUNTCOUNT_LIMIT 下方开始......)

      顺便说一句:这段代码让我有点头疼。我真的不建议在watch_count 中修改count,因为控制流可能很难确定您是否曾经有多个线程运行该函数并且您开始使用pthread_cond_broadcast

      【讨论】:

      • 我从一个 POSIX 线程教程中复制了这段代码,所以它只是为了学习目的。
      猜你喜欢
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多