生产者-消费者C编程中的死锁
我正在尝试用C实现一个单生产者多消费者程序,我在消费者中使用字符“\0”来查看它是否是文件的结尾。然而,当有多个使用者,并且当他们都在等待最后一个字符,但其中只有一个进入了关键部分并使用该字符时,就会发生死锁。这是我的密码:生产者-消费者C编程中的死锁,c,concurrency,C,Concurrency,我正在尝试用C实现一个单生产者多消费者程序,我在消费者中使用字符“\0”来查看它是否是文件的结尾。然而,当有多个使用者,并且当他们都在等待最后一个字符,但其中只有一个进入了关键部分并使用该字符时,就会发生死锁。这是我的密码: void insert(char* buffer, char value){ printf("lock in insert %c\n", value); sem_wait(&empty); sem_wait(&mutex);
void insert(char* buffer, char value){
printf("lock in insert %c\n", value);
sem_wait(&empty);
sem_wait(&mutex);
printf("insert %c\n",value);
buffer[in] = value;
in = (in+1) % BUFFER_SIZE;
sem_post(&mutex);
sem_post(&full);
}
char get(char* buffer) {
char item;
printf("lock in get\n");
sem_wait(&full);
sem_wait(&mutex);
item = buffer[out];
printf("comsume %c\n",item);
out = (out+1)%BUFFER_SIZE;
sem_post(&mutex);
sem_post(&empty);
return item;
}
void *produce(void *param) {
int i=0;
char randomChar;
for(i=0; i<NUM_OF_INTEGERS; ++i) {
randomChar = 'A' +random()%26;
insert(buffer, randomChar);
}
insert(buffer, '\0');
printf("produce finished\n");
}
void *consume(void *param) {
int i=0;
char data;
do{
data = get(buffer);
}while(data != '\0');
printf("consume finished\n");
}
void插入(字符*缓冲区,字符值){
printf(“锁定插入%c\n”,值);
sem_等待(&empty);
sem_等待(&mutex);
printf(“插入%c\n”,值);
缓冲区[in]=值;
in=(in+1)%BUFFER\u大小;
sem_post(和互斥);
sem_职位(完整);
}
字符获取(字符*缓冲区){
字符项;
printf(“锁定获取\n”);
sem_等待(&full);
sem_等待(&mutex);
项目=缓冲区[输出];
printf(“消费%c\n”,项目);
out=(out+1)%BUFFER\u大小;
sem_post(和互斥);
sem_post(&空);
退货项目;
}
void*product(void*param){
int i=0;
随机字符;
对于其他人提到的(i=0;i),您需要为每个消费者发送多个终止符(即)
在生产中
,更改:
insert(buffer, '\0');
进入:
(i=0;i分段故障可能发生
缓冲区
大小为10个字节,实际存储的是20个字节
将缓冲区大小更改为20
#define BUFFER_SIZE 20
生产者/消费者模型队列并发访问。请阅读有关问题的定义。您只是使用固定缓冲区同时填充和读取,而不是作为队列系统。无论如何,您需要定义如何停止。您的设计存在根本性缺陷。您需要为发送给每个消费者的消息设置一个单独的结束标记。您无法对于每个人来说,只有一个结束标记,因为只有一个消费者可以读取ITG。我明白我不是在使用排队系统,但事情是我把它改为队列而不是数组,死锁仍然存在,如何为每个人定义一个结束标记?考虑使用标准库中的原子类型,释放和消耗内存ORD。ring?为了避免并发,我建议使用一个信号量变量。基本上,您的关键代码部分是访问buffer
的地方。尝试使用一个信号量变量实现。谢谢,我刚刚注意到我应该使用out=(out+1)%buffer\u SIZE而不是out=(out+1)%NUM\u of\u INTEGER来确定缓冲区中的位置
#define BUFFER_SIZE 20