資源簡介
在Linux操作系統下用C或C++實現經典同步問題:生產者-消費者問題。
含源代碼和文檔。
內容:
1.一個大小為10的緩沖區,初始狀態為空。
2.2個生產者,隨機等待一段時間,往緩沖區中添加數據,若緩沖區已滿,等待消費者取走數據之后再添加,重復10次。
3.2個消費者,隨機等待一段時間,從緩沖區中讀取數據,若緩沖區為空,等待生產者添加數據之后再讀取,重復10次。

代碼片段和文件信息
#include?
#include?
#include?
#include?
/*信號量*/
//空的信號量和滿的信號量
sem_t?empty_sem?full_sem;???
//靜態創建條件變量
pthread_cond_t?full?=?PTHREAD_COND_INITIALIZER;????????//滿的變量
pthread_cond_t?empty?=?PTHREAD_COND_INITIALIZER;???????//空的變量
pthread_mutex_t?lock?=?PTHREAD_MUTEX_INITIALIZER;??????//互斥鎖
#define?BUFFERNUM?10????
//緩沖區隊列
struct?Buffer_Queue?{
char?production[BUFFERNUM];??//產品
int?front?rear;?????????????//頭指針和尾指針
int?num;?????????????????????//緩沖區里面字母數量????????
};
//輸出設計者信息
void?printDesign()
{
printf(“???┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n“);
printf(“???┃????????????生產者-消費者問題實現?????????????????┃\n“);
printf(“???┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n“);
}
//隨機產生生產字符
char?getRandChar()
{
int?temp?=?rand()%26;
return?(‘a‘+temp);
}
//打印進程運行結果
void?printTime()
{
//打印時間
time_t?now;
struct?tm?*timenow;?????????//實例化tm結構指針
time(&now);
timenow?=?localtime(&now);
printf(“執行時間:?%s?“asctime(timenow));
}
//生產者1
void?*producer1(void?*arg)
{
struct?Buffer_Queue?*q;
q?=?(struct?Buffer_Queue?*)?arg;
while(1)
{
pthread_mutex_lock(&lock);???????
while?(q->num?==?BUFFERNUM)????//緩沖區已經滿了,等待
{????????????
pthread_cond_wait(&full?&lock);
}
sem_wait(&empty_sem);
/*生產產品*/
char?c?=?getRandChar();??????????????????????????????????????//隨機獲取字母
q->rear?=?(q->rear?+?1)?%?BUFFERNUM;?????????????????????????//計算新的尾指針???
q->production[q->rear]?=?c;??????????????????????????????????//寫入新產品
q->num++;
/*打印輸出結果*/
printf(“-------------------------------------------------------------\n“);
printTime();??????????????//程序運行時間
int?i;
printf(“緩沖區數據(%d個):“q->num);??????????????????//打印緩沖區中的數據
if(q->front?rear)
{
for(i?=?q->front;?i?<=?q->rear;?i++)
printf(“%c?“q->production[i]);
}
else
{
for(i?=?q->front;?i? printf(“%c?“q->production[i]);
for(i?=?0;?i?<=?q->rear;?i++)
printf(“%c?“q->production[i]);
}
printf(“\n當前執行的進程:生產者1\n“);???//打印當前執行的進程
printf(“產生的數據:%c\n“c);??????//打印產生或消費的數據
printf(“-------------------------------------------------------------\n“);
sem_post(&full_sem);
if?(q->num?==?1)?{
pthread_cond_signal(&empty);????
}
pthread_mutex_unlock(&lock);?
sleep(rand()?%?2);????????????
}
}
//生產者2
void?*producer2(void?*arg)
{
struct?Buffer_Queue?*q;
q?=?(struct?Buffer_Queue?*)?arg;
while(1)
{
pthread_mutex_lock(&lock);???????
while?(q->num?==?BUFFERNUM)????//緩沖區已經滿了,等待
{????????????
pthread_cond_wait(&full?&lock);
}
sem_wait(&empty_sem);
/*生產產品*/
char?c?=?getRandChar();??????????????????????????????????????//隨機獲取字母
q->rear?=?(q->rear?+?1)?%?BUFFERNUM;?????????????????????????//計算新的尾指針???
q->production[q->rear]?=?c;??????????????????????????????????//寫入新產品??
q->num++;
/*打印輸出結果*/
printf(“-------------------------------------------------------------\n“);
printTime();??????????????//程序運行時間
int?i;
printf(“緩沖區數據(%d個):“q->num);????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????233984??2013-08-07?19:34??生產者-消費者問題\文檔.doc
?????文件???????8144??2013-08-07?19:43??生產者-消費者問題\源代碼\ProducerConsumer.c
?????目錄??????????0??2013-08-07?19:43??生產者-消費者問題\源代碼
?????目錄??????????0??2013-08-07?19:48??生產者-消費者問題
-----------?---------??----------?-----??----
???????????????242128????????????????????4
- 上一篇:用C++實現的CURE算法的源碼
- 下一篇:蒙特卡洛法的程序代碼
評論
共有 條評論