【问题标题】:Why doesn't the pthread condition variable work为什么 pthread 条件变量不起作用
【发布时间】:2016-12-16 00:17:20
【问题描述】:

我正在编写代码以模拟卖票情况:
两个线程在一张一张卖票,一个线程是在票数为0时显示sold out。
所以我尝试使用条件变量。这是代码:

int a = 10;
pthread_mutex_t mtx;
pthread_cond_t cond;


void * funca(void *p)
{
    while(1)
    {
        pthread_mutex_lock(&mtx);
        if (a == 0)
        {
            break;
        }
        a--;
        pthread_mutex_unlock(&mtx);
        sleep(1);
    }
    pthread_mutex_unlock(&mtx);
    pthread_cond_broadcast(&cond);
    return NULL;
}

void * funcb(void *p)
{
    while(1)
    {
        pthread_mutex_lock(&mtx);
        if (a == 0)
        {
            break;
        }
        a--;
        pthread_mutex_unlock(&mtx);
        sleep(1);
    }
    pthread_mutex_unlock(&mtx);
    pthread_cond_broadcast(&cond);
    return NULL;
}

void * funcc(void *p)
{
    pthread_mutex_lock(&mtx);
    while(a != 0)
    {
            pthread_cond_wait(&cond, &mtx);
            printf("I'm nothing");
    }
    pthread_mutex_unlock(&mtx);
    printf("sold out\n");
    return NULL;
}

但是,当我执行上面的代码时,我得到一个无限循环,打印了许多 I'm nothing。

【问题讨论】:

  • 你还没有初始化你的互斥量和条件变量。声明变量时使用pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 和pthread_cond_t cond = PTHREAD_COND_INITIALIZER;。 (funca() 和 funcb() 有两个相同的函数也没有意义,你可以让两个不同的线程执行相同的函数。
  • @caf 你能写一个我能接受的答案吗?

标签: c multithreading pthreads mutex race-condition


【解决方案1】:

你还没有初始化你的互斥量和条件变量。声明变量时,请使用:

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

funca() 和 funcb() 有两个相同的函数也没有意义,你可以让两个不同的线程执行相同的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2011-02-15
    • 2011-02-11
    • 1970-01-01
    • 2011-05-12
    • 2012-08-23
    相关资源
    最近更新 更多