我正在尝试实施生产者 - 消费者模型,但我遇到了一些问题。考虑代码
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(¬_full,&mutex);
number++;
pthread_cond_signal(¬_empty);
pthread_mutex_unlock(&mutex);
}
}
void* worker(void* p){
while(1){
pthread_mutex_lock(&mutex);
if(number == 0)
pthread_cond_wait(¬_empty,&mutex);
number--;
pthread_cond_signal(¬_full);
pthread_mutex_unlock(&mutex);
//possible delay
}
}
也许这对你来说是显而易见的,但我无法弄清楚变量数如何变为负数当然让工人线程进一步递减它。我做错了什么?
- 编辑 -
确定有一个进展正在进行(number == 0)而不是if,但是我仍然不明白怎么会发生这样的情况:在获得not_empty信号之后可能有两个线程递减变量而它少于2
答案 0 :(得分:2)
我认为如果同时替换可能会掩盖问题而不是解决问题。每Why do pthreads’ condition variable functions require a mutex?个条件变量使用的互斥锁用于保护对该条件变量的访问。在您的情况下,您似乎正在使用mutex
来保护三件事:全局number
和两个条件变量not_full
和not_empty
。
你需要实现的东西 - pthread_cond_wait()的实现将解锁你的互斥锁,并在它返回之前重新锁定它,这个被打开的窗口允许其他线程在你不想要的时候进入他们来。使用while替换if是一种解决方案,但是另一种解决方案是在您的worker中使用第二个互斥锁来保护对“number”和条件等待的访问。