我想在C中實現單生產者多用戶程序,並且在消費者中使用字符'\ 0'來查看它是否是文件的結尾。然而,當有多個消費者時以及當他們都在等待最後一個字符時,會發生死鎖,但只有其中一個人進入了關鍵部分並使用此字符。這裏是我的代碼:生產者 - 消費者C編程中的死鎖
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");
}
生產者/消費者模型排隊的併發訪問。請閱讀有關問題的定義。你只需要使用一個固定的緩衝區並行填充和讀取,而不是作爲一個排隊系統。無論如何,你需要定義你如何停下來。 –
您的設計有根本性的缺陷。您需要爲每個消費者提供單獨的結束標記。每個人都不能只有一個結束標記,因爲只有一個消費者可以讀取它。 – Barmar
我知道我沒有使用排隊系統,但是我甚至將它改爲隊列而不是數組,死鎖仍然存在,如何爲每個人定義一個結束標記? – pousT