gpt4 book ai didi

消费者/生产者程序卡住了

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:28 33 4
gpt4 key购买 nike

下面是一个示例消费者/生产者模型的代码:

int buffer[MAX];
int fill_ptr = 0;
int use_ptr = 0;
int count = 3;

void put(int value) {
buffer[fill_ptr] = value;
fill_ptr = (fill_ptr + 1) % MAX;
count++;
}

int get() {
int tmp = buffer[use_ptr];
use_ptr = (use_ptr + 1) % MAX;
count--;
return tmp;
}

cond_t empty, fill;
mutex_t mutex;
void *producer(void *arg) {
int i;
for (i = 0; i < loops; i++) {
pthread_mutex_lock(&mutex); // p1
while (count == MAX) // p2
pthread_cond_wait(&empty, &mutex); // p3
put(i);// p4
pthread_cond_signal(&fill); // p5
pthread_mutex_unlock(&mutex); // p6
}
}


void* consumer(void *arg) {
int i;
for (i = 0; i < loops; i++) {
pthread_mutex_lock(&mutex); // c1
while (count == 0) // c2
pthread_cond_wait(&fill, &mutex); // c3
int tmp = get(); // c4
pthread_cond_signal(&empty); // c5
pthread_mutex_unlock(&mutex); // c6
printf("%d\n", tmp);
}
}

但是,我认为这里有一个问题。假设 MAX=3,并且最初缓冲区已满(计数 = 3),那么消费者可以执行 get() 并向生产者发出信号。生产者接收到信号后,它醒来并开始在缓冲区[0] 中执行 put() 并持有互斥锁。

假设生产者刚刚陷入put();那么即使还剩下 2 个资源,消费者也无法继续(因为互斥量由生产者持有)。

我的理解对吗?如果是这样,那是不公平的,因为还剩下 2 个资源可以消耗。

最佳答案

Is my understanding correct?

既是又不是。

是的,如果生产者调用put并且put获取,消费者会卡住是正确的卡住(例如进入无限循环)。

但是,您不能假设还剩下 2 个资源pthread_cond_signal 不保证 producerconsumer 读取所有 3 个元素之前执行。您所知道的是,消费者 至少读取了一个元素,但在生产者执行之前它可能读取了 2 个甚至 3 个。

If so, that's unfair ....

不,这并不公平。这正是互斥锁的用途,即确保只有一个线程可以访问共享资源。

因此,确保持有互斥锁的线程不会卡住很重要!这是您作为程序员的责任。

注意:在您的情况下,put 中没有任何东西会导致线程卡住。

关于消费者/生产者程序卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38293393/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com