Posix執行緒 生產者與消費者問題

2021-09-13 03:32:16 字數 1873 閱讀 9745

#include #include #include #include #include #include #include #include #define err_exit(m) \

dowhile(0)

#define consumers_count 1 //消費者數量

#define producers_count 5 //生產者數量

#define buffsize 10 //緩衝區大小,倉庫大小

int g_buffer[buffsize];//緩衝區

unsigned short in = 0;//生產初始存放位置

unsigned short out = 0;//消費取出的位置

unsigned short produce_id = 0; //正在生產的id從0開始

unsigned short consume_id = 0;//正在消費的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)

//那個執行緒正在消費那個產品

consume_id = g_buffer[out];

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

g_buffer[out] = -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);//v操作,消費完乙個訊號量,訊號量加1

sleep(5); }

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);//v乙個空的訊號量,釋放資源,訊號量加1

sleep(1);

} return null;

}int main(void)

sem_init(&g_sem_full, 0, buffsize);//初始化訊號量,緩衝區現有空間,防止溢位

sem_init(&g_sem_empty, 0, 0);//初始化訊號量,用於通知消費者有產品

pthread_mutex_init(&g_mutex, null);//初始化互斥量

//初始化執行緒

for(i=0; ifor(i=0; i//執行緒**

for(i=0; isem_destroy(&g_sem_full);//銷毀訊號量

sem_destroy(&g_sem_empty);//銷毀訊號量

pthread_mutex_destroy(&g_mutex);//銷毀互斥鎖

return 0;

}

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者執行緒

include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...

生產者消費者執行緒

該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...