2016-11-24 42 views
2

我想在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");  
} 
+0

生產者/消費者模型排隊的併發訪問。請閱讀有關問題的定義。你只需要使用一個固定的緩衝區並行填充和讀取,而不是作爲一個排隊系統。無論如何,你需要定義你如何停下來。 –

+0

您的設計有根本​​性的缺陷。您需要爲每個消費者提供單獨的結束標記。每個人都不能只有一個結束標記,因爲只有一個消費者可以讀取它。 – Barmar

+0

我知道我沒有使用排隊系統,但是我甚至將它改爲隊列而不是數組,死鎖仍然存在,如何爲每個人定義一個結束標記? – pousT

回答

0

正如其他人所說,你需要發送一個以上終止(即)一個爲每個消費者。

produce,更改:

insert(buffer, '\0'); 

分爲:可發生

for (i=0; i<NUM_OF_CONSUMER; ++i) 
    insert(buffer, '\0'); 
0

分段故障。

buffer大小爲10字節,實際存儲的是20字節。

變化buffer大小爲20

#define BUFFER_SIZE 20 
+0

謝謝,我只注意到我應該使用out =(out + 1)%BUFFER_SIZE而不是out =(out + 1)%NUM_OF_INTEGER來確定緩衝區中的位置 – pousT