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

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