c - 为什么 pthread 条件变量不起作用

标签 c multithreading pthreads mutex race-condition

我正在编码以模拟卖票情况:
两个线程一张一张卖票,一个线程当票数为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() 有两个相同的函数也没有意义,您可以让两个不同的线程执行相同的函数。

关于c - 为什么 pthread 条件变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41175454/

相关文章:

c - 为什么我的 printf float 不显示? (初学者)

android - 从ndk中的不同线程调用java方法

c - pthreads:以编程方式收集有关在不同状态下花费的时间的信息?

c# - 使用 Thread.Abort() 有什么问题

java - 立即停止线程

linux - pthread.h - 自愿 CPU 让出是调度另一个用户级线程的唯一触发器吗?

C pthread 加入一个结束的线程

c - 如何在 C 中反转单链表?

C 程序 : Do-while loop to run program again not working properly

c - 用户定义的连接函数