生产者 - 消费者正确实施

时间:2011-10-28 10:49:02

标签: pthreads producer-consumer

我正在尝试实施生产者 - 消费者模型,但我遇到了一些问题。考虑代码

int number=0;

void* master(void* p){
    int i;
    pthread_t workers[5];
    for(i=0;i<5;i++)
        pthread_create(&workers[i],NULL,worker,NULL);

    while(1){
        //possible delay

        pthread_mutex_lock(&mutex);
        if(number == LIMIT)
            pthread_cond_wait(&not_full,&mutex);

        number++;
        pthread_cond_signal(&not_empty);
        pthread_mutex_unlock(&mutex);
    }
}

void* worker(void* p){
    while(1){
        pthread_mutex_lock(&mutex);
        if(number == 0)
            pthread_cond_wait(&not_empty,&mutex);

        number--;
        pthread_cond_signal(&not_full);
        pthread_mutex_unlock(&mutex);

        //possible delay
    }
}

也许这对你来说是显而易见的,但我无法弄清楚变量数如何变为负数当然让工人线程进一步递减它。我做错了什么?

- 编辑 -

确定有一个进展正在进行(number == 0)而不是if,但是我仍然不明白怎么会发生这样的情况:在获得not_empty信号之后可能有两个线程递减变量而它少于2

1 个答案:

答案 0 :(得分:2)

我认为如果同时替换可能会掩盖问题而不是解决问题。每Why do pthreads’ condition variable functions require a mutex?个条件变量使用的互斥锁用于保护对该条件变量的访问。在您的情况下,您似乎正在使用mutex来保护三件事:全局number和两个条件变量not_fullnot_empty

你需要实现的东西 - pthread_cond_wait()的实现将解锁你的互斥锁,并在它返回之前重新锁定它,这个被打开的窗口允许其他线程在你不想要的时候进入他们来。使用while替换if是一种解决方案,但是另一种解决方案是在您的worker中使用第二个互斥锁来保护对“number”和条件等待的访问。