【问题标题】:condition variables error in mutex locks互斥锁中的条件变量错误
【发布时间】:2015-11-17 08:19:25
【问题描述】:

好的,所以在下面的代码中至少有两个应该纠正的主要问题。

#define COUNT_LIMIT 12
pthread_mutex_t c_mutex;
pthread_cond_t cond_cv;

int count=0;

void *inc_count(void *param)
{
    int i=0;
    for (i=0;i<14;i++) {
        count++;
        if (count==COUNT_LIMIT)
            pthread_cond_signal(&cond_cv);
    }
}

void *watch_count(void *param)
{
    pthread_mutex_lock(&c_mutex);
    while (count<COUNT_LIMIT) {
        pthread_cond_wait(&cond_cv, &c_mutex);
        printf("watch_count(): signal received.\n");
    }
    pthread_mutex_unlock(&c_mutex);
    pthread_exit(NULL);
}

我发现的第一个问题是在while循环的watch_count()函数中,这里的逻辑是错误的,因为当count为12时,它不会小于COU​​NT_LIMIT。所以要解决这个问题,我会将其更改为

while(count <= COUNT_LIMIT)

在发出 watch_count() 信号后,另一件事是解锁互斥锁吗?

否则,我找不到任何其他错误。我尝试阅读this,但我无法理解它。

【问题讨论】:

  • while 条件很好。 “当计数为 12 时,它不会小于 COUNT_LIMIT”。这正是我们想要的。它应该一直循环,直到计数达到 12。不需要您的更改。
  • 我不认为您的问题带有对期望行为的一些合理描述?

标签: c pthreads mutex condition-variable


【解决方案1】:

一个错误是inc_count() 函数在访问count 变量时需要锁定互斥锁。

您对while() 循环的建议更改不正确 - 如果count == COUNT_LIMIT,它应该再次调用pthread_cond_wait(),因此原始测试是正确的。

另一个错误可能是 c_mutexcond_cv 未正确初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2018-03-09
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多