gpt4 book ai didi

C - 生产者/消费者死锁问题

转载 作者:行者123 更新时间:2023-12-01 09:11:55 26 4
gpt4 key购买 nike

我正在尝试在有界缓冲区中使用生产者/消费者线程。缓冲区长度为 5。我有 1 个互斥体和 2 个信号量,空信号量从缓冲区大小开始,满信号量从 0 开始。

当我在最后没有 sleep() 的情况下运行代码时,它会不断生成直到缓冲区完全充满,消耗直到它为空,因此输出如下所示:

Placed 1 in the buffer at position 0.
Placed 2 in the buffer at position 1.
Placed 3 in the buffer at position 2.
Placed 4 in the buffer at position 3.
Placed 5 in the buffer at position 4.
The buffer now contains 0 at position 0.
The buffer now contains 0 at position 1.
The buffer now contains 0 at position 2.
The buffer now contains 0 at position 3.
The buffer now contains 0 at position 4.

但是,当我最后使用 sleep() 运行时,它会打印出:

Placed 1 in the buffer at position 0.
The buffer now contains 0 at position 0.

然后它似乎锁定了,但我不太确定为什么它的行为方式与 sleep 是否存在无关。有什么建议么?我的 main 方法本质上只是进行一些声明,然后创建 1 个线程来生产和 1 个线程来使用,这些方法如下。

void *producer()
{
int k = 0; //producer index
while (1)
{
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[k] = k+1;
sem_post(&full);
pthread_mutex_unlock(&mutex);
printf("Placed %d in the buffer at position %d.\n", buffer[k], k);
k = (k + 1) % BUFFER_SIZE;
sleep(rand() * 10);
}
}

void *consumer()
{
int j = 0; //consumer index
while(1)
{
sem_wait(&full);
pthread_mutex_lock(&mutex);
buffer[j] = 0;
sem_post(&empty);
pthread_mutex_unlock(&mutex);
printf("The buffer now contains %d at position %d.\n", buffer[j], j);
j = (j + 1) % BUFFER_SIZE;
sleep(rand() * 10);

}
}

最佳答案

sleep() 的参数是 sleep 的秒数。 rand() 返回 0 到 RAND_MAX 之间的整数(通常为 32767 或 231-1),当您将其乘以 10 时,您可以得到我们的 sleep 时间长得离谱。你并没有陷入僵局,只是睡了很长时间。

关于C - 生产者/消费者死锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4109173/

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