資源簡介
在Windows和Linux操作系統上,利用各自操作系統提供的Mutex和信號量機制(Win32 API或Pthreads),實現生產者/消費者問題。

代碼片段和文件信息
#pragma?comment(lib?“pthreadVSE2.lib“)
#include?
#include?
#include?
#include?
using?namespace?std;
const?unsigned?short?BUFFER_SIZE=?10;?//緩沖區長度
unsigned?short?ProductID?=?0;????//產品號
unsigned?short?ConsumeID?=?0;????//將被消耗的產品號
unsigned?short?in?=?0;??????//產品進緩沖區時的緩沖區下標
unsigned?short?out?=?0;??????//產品出緩沖區時的緩沖區下標
int?BUFFER[BUFFER_SIZE];????//緩沖區是個循環隊列
bool?g_continue?=?true;??????//控制程序結束
pthread_mutex_t?g_hMutex;???????//用于線程間的互斥
sem_t?g_hFullSemaphore;?????//當緩沖區滿時迫使生產者等待
sem_t?g_hEmptySemaphore;?????//當緩沖區空時迫使消費者等待
void?*produce(void?*param);???????//生產者進程
void?*consume(void?*param);???????//消費者進程
void?main()
{
cout<<“在Linux操作系統上,利用Mutex和信號量機制(Pthreads),實現生產者/消費者問題“< cout< getchar();
pthread_mutex_init(&g_hMutexNULL);//創建各個互斥信號
sem_init(&g_hFullSemaphore00);
sem_init(&g_hEmptySemaphore05);
const?unsigned?short?PRODUCERS_COUNT?=?3;??//生產者的個數
????const?unsigned?short?CONSUMERS_COUNT?=?1;??//消費者的個數
const?unsigned?short?THREADS_COUNT?=?PRODUCERS_COUNT+CONSUMERS_COUNT;//總的線程數
????HANDLE?hThreads[PRODUCERS_COUNT];?
pthread_t?producer[CONSUMERS_COUNT];???????????//生產者進程
????pthread_t?consumer[THREADS_COUNT];???????????//消費者進程
for(int?e=0;e {
BUFFER[e]=0;
}
for(int?i=0;i pthread_create(&producer[i]?NULL&produce?NULL);//創建生產者進程
}
for(int?j=0;j pthread_create(&consumer[j]?NULL&consume?NULL);//創建消費者進程
}
while(g_continue){
????????if(getchar()){?//按回車后終止程序運行
????????????g_continue?=?false;
????????}
????}
}
//生產一個產品。簡單模擬了一下,僅輸出新產品的ID號
void?Producing()
{
????cout< cout<<“生產一個產品:?“<<++ProductID< }
void?Consuming()
{
????cout< cout<<“消費一個產品:?“< }
void?Append()
{
????cout<<“向緩沖區存入一個新產品“;
BUFFER[in]=ProductID;
in=(in+1)%BUFFER_SIZE;
cout< cout<<“緩沖區??產品“< //新產品放入緩沖區后,輸出緩沖區當前的狀態
for(int?i=0;i {
if(in>=out)
{
if?(i=out)
cout< else
cout< }
else
{
if(i>=in?&&?i cout< else
cout< }
cout< }
}
void?Take()
{
cout< cout<<“按序從緩沖區取出一個產品“;
ConsumeID=BUFFER[out];
out=(out+1)%BUFFER_SIZE;
cout< cout< cout<<“緩沖區??產品“< //取出一個產品后,輸出緩沖區當前的狀態
for(int?i=0;i {
if(in>=out)
{
if?(i=out)
cout< else
cout< }
else
{
if(i>=in?&&?i cout< else
cout< }
cout< ????}
}
void?*produce(void?*param){
while(g_continue){
????????Sleep(1500);
sem_wait(&g_hEmptySemaphor
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6548??2010-05-27?20:02??Produce_Consume_Pthread\Debug\BuildLog.htm
?????文件?????????63??2010-05-27?20:02??Produce_Consume_Pthread\Debug\mt.dep
?????文件?????593408??2010-05-27?20:02??Produce_Consume_Pthread\Debug\produce_consume.exe
?????文件????????406??2010-05-20?14:24??Produce_Consume_Pthread\Debug\produce_consume.exe.em
?????文件????????472??2010-05-20?14:24??Produce_Consume_Pthread\Debug\produce_consume.exe.em
?????文件????????381??2010-05-27?20:02??Produce_Consume_Pthread\Debug\produce_consume.exe.intermediate.manifest
?????文件????1392476??2010-05-27?20:02??Produce_Consume_Pthread\Debug\produce_consume.ilk
?????文件?????282191??2010-05-27?20:02??Produce_Consume_Pthread\Debug\produce_consume.obj
?????文件????3058688??2010-05-27?20:02??Produce_Consume_Pthread\Debug\produce_consume.pdb
?????文件??????50176??2010-05-20?14:23??Produce_Consume_Pthread\Debug\vc60.idb
?????文件??????53248??2010-05-20?14:23??Produce_Consume_Pthread\Debug\vc60.pdb
?????文件?????609280??2010-05-27?20:02??Produce_Consume_Pthread\Debug\vc90.idb
?????文件?????233472??2010-05-27?20:02??Produce_Consume_Pthread\Debug\vc90.pdb
?????文件???????3904??2010-05-27?20:02??Produce_Consume_Pthread\produce_consume.cpp
?????文件???????3509??2010-05-20?14:23??Produce_Consume_Pthread\produce_consume.dsp
?????文件????????553??2010-05-20?14:23??Produce_Consume_Pthread\produce_consume.dsw
?????文件????9636864??2010-05-27?20:04??Produce_Consume_Pthread\produce_consume.ncb
?????文件??????48640??2010-05-20?14:23??Produce_Consume_Pthread\produce_consume.opt
?????文件??????18632??2010-05-20?14:23??Produce_Consume_Pthread\produce_consume.plg
?????文件????????895??2010-05-27?19:57??Produce_Consume_Pthread\produce_consume.sln
????..A..H.??????9728??2010-05-27?20:04??Produce_Consume_Pthread\produce_consume.suo
?????文件???????4949??2010-05-20?14:24??Produce_Consume_Pthread\produce_consume.vcproj
?????文件???????1423??2010-05-27?20:04??Produce_Consume_Pthread\produce_consume.vcproj.SUNNY-yang-PC.SUNNY-yang.user
?????目錄??????????0??2011-05-10?14:07??Produce_Consume_Pthread\Debug
?????目錄??????????0??2011-05-10?14:07??Produce_Consume_Pthread
-----------?---------??----------?-----??----
?????????????16009906????????????????????25
- 上一篇:氣象CDO說明
- 下一篇:FLASH拼圖游戲源碼
評論
共有 條評論