【发布时间】:2015-03-27 00:19:08
【问题描述】:
我正在浏览 this 和 this 链接。基本上,他们正在讨论为什么经典的单线程生产者消费者设计(signal 和 wait 不适用于多生产者场景)。我有一个疑问一直困扰着我 -
作者的论证
考虑参考代码
char queue[MAX]; //global
int head = 0, tail = 0; //global
struct cv not_full, not_empty;
struct lock qlock;
void produce(char data) {
acquire(&qlock);
if ((head + 1) % MAX == tail) {
wait(¬_full, &qlock); //line 1
}
queue[head] = data; //line 2
head = (head + 1) % MAX;
notify(¬_full);
release(&qlock);
}
char consume(void) {
acquire(&qlock);
if (tail == head) {
wait(¬_empty, &qlock);
}
e = queue[tail];
tail = (tail + 1) % MAX;
notify(¬_empty);
release(&qlock);
return e;
}
在上面的代码中,如果有两个生产者,line 1 将在单个消费者的两个生产者线程中为woken up(当队列未满时)。所以两个生产者都可以添加到队列中导致队列溢出。
我的疑问
一种。我们正在使用互斥锁保护队列。因此,即使wait 在多个生产者线程上被唤醒,也只有一个生产者仍然拥有互斥锁——因此从逻辑上讲,只有一个生产者“拥有”添加到队列的权利。因为当我们从wait 出来时,我们将获得互斥锁。
告诫
我使用 POSIX mutex,cond var 作为参考。但是,我没有看到以 POSIX 作为参考标准编写的文章。
问题
我对wait 特别是pthread_cond_wait 的理解是否正确?并且有多个生产者,代码的完整性仍然保持。
【问题讨论】:
-
你的意思是
pthread_mutex_wait还是pthread_cond_wait? -
@UmNyobe:正确我会编辑它。
-
我不确定您的具体问题是什么,但是如果您将 2 个
if语句转换为while语句并使用 pthread_cond_broadcast 作为notify() 原语。但按原样,代码有爆炸的风险。
标签: c++ multithreading pthreads posix producer-consumer