#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...