生產者消費者問題(C實現)

2021-07-23 13:08:28 字數 2713 閱讀 1084

生產者消費者問題是作業系統中的乙個經典的問題。

然後看了作業系統的書籍如何解決書上給的偽**是這樣的

item b[k];

semaphore empty; empty=k; //可以使用的空緩衝區數

semaphore full; full=0; //緩衝區內可以使用的產品數

semaphore mutex; mutex=1; //互斥訊號量

intin=0; //放入緩衝區指標

intout=0; //取出緩衝區指標

cobegin

process producer_i ( ) }

} }

coend

上面的注釋,和過程已經比較到位了,只是我習慣用我的方法,即把生產和消費,放入臨界區所以下面是我解決生產消費模型所用的偽**

item b[k];

semaphore empty; empty=k; //可以使用的空緩衝區數

semaphore full; full=0; //緩衝區內可以使用的產品數

semaphore mutex; mutex=1; //互斥訊號量

intin=0; //放入緩衝區指標

intout=0; //取出緩衝區指標

cobegin

process producer_i ( ) }

} }

coend

好了說了這麼多我該帖下我的**了,此**在linux環境下的多執行緒操作,用到了訊號量的。。。

#include 

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

#define consumers_count 2 //消費者人數

#define producers_count 2 //生產者人數

#define buffsize 5

int g_buffer[buffsize]; //緩衝區數目

unsigned

short in = 0; //放入產品的指標(生產到哪個緩衝區)

unsigned

short out = 0; //取出緩衝區指標 (在哪個緩衝區消費的)

unsigned

short produce_id = 0;

unsigned

short consume_id = 0;

sem_t g_sem_full; //可以使用的空緩衝區數(緩衝區中可以生產多少產品)

sem_t g_sem_empty; //緩衝區內可以使用的產品數(可以消費的產品數)

pthread_mutex_t g_mutex; //互斥訊號量

pthread_t g_thread[consumers_count + producers_count];

void *consume(void *arg)

//produce()操作(生產產品)

consume_id = g_buffer[out];

printf("%d begin consume product %d\n", num, consume_id);

g_buffer[out] = -1;

//將取出緩衝區的指標偏移1(下個生產的位置)

out = (out + 1) % buffsize;

printf("%d end consume product %d\n", num, consume_id);

pthread_mutex_unlock(&g_mutex);

sem_post(&g_sem_full);

sleep(1);

}return null;

}void *produce(void *arg)

printf("%d begin produce product %d\n", num, produce_id);

g_buffer[in] = produce_id;

in = (in + 1) % buffsize;

printf("%d end produce product %d\n", num, produce_id++);

pthread_mutex_unlock(&g_mutex);

sem_post(&g_sem_empty);

sleep(5);

}return null;

}int main(void)

將程式執行,可得到這個結果

C 實現「生產者消費者」問題

有時候我們做專案時不免遇到這樣乙個問題 我們需要做乙個功能,該功能需要處理來自於其他地方的資料,但是你需要保證任務需要乙個乙個循序漸進的進行,與此同時,資料 的時機不可預知,有時任務一下子來了100條,有時一下子只來了1條,你要怎樣處理這些資料,使得這些任務被執行的時候是一條一條的執行的。描述真含糊...

生產者消費者問題C 實現

2020 10 11 11 23 設計c c 程式 可以嵌入組合語言 以忙等待方式實現訊號量及其p v操作。利用你實現的訊號量,實現生產者 消費者問題。給出實現方法 主要源 和測試結果。include include include include include include include i...

生產者 消費者問題實現

include include include include include include define need p 2 生產者程序數 define need c 2 消費者程序數 define works p 10 每個生產者程序執行的次數 define works c 10 每個消費者程序...