⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 操作.cpp

📁 同步生产者与消费者
💻 CPP
字号:
#include<stdio.h> 
#include<iostream.h> 
#include<windows.h> 
#define BufferSize 15 
char Buffer[BufferSize]; 
int head,tail=0;//Buffer数组下标 
int count;//被使用的缓冲区数量 
HANDLE hMutex; 
HANDLE hNotFullEvent, hNotEmptyEvent;//用来同步生产者和消费者线程 
////////缓冲区存储情况 
display(char a[15]) 
{ 
int i; 
cout<<"缓冲区存储情况为:"<<endl; 
for (i=14;i>=0;i--){ 
cout<<"\t|----"<<a<<"----|"<<endl; 
} 
return 0;
} 

//p1 
void p1_Producer() 
{ 
int i; 
char ch; 
char p1[]={'a','A','b','B','c','C','D','d','E','e'}; 
if(tail<15){ 
for(i=0;i<10;i++){ 
while(1) { 

WaitForSingleObject(hMutex,INFINITE); 
if(count==BufferSize){ //缓冲区满 
ReleaseMutex(hMutex); 
//等待直到缓冲区非满 
WaitForSingleObject(hNotFullEvent,INFINITE); 
continue; 
} 
//得到互斥锁且缓冲区非满,跳出while循环 
break; 

} 
if (tail>14){ 
cout<<"缓冲区已满,不能再存入数据!"<<endl; 
ReleaseMutex(hMutex); //结束临界区 
PulseEvent(hNotEmptyEvent); //唤醒消费者线程 
} 
else{ 
//得到互斥锁且缓冲区非满,开始产生新数据 
cout<<"Producer p1:\t"<<p1<<endl; 
Buffer[tail]=p1; 
//tail=(tail+1)%BufferSize;///存放于缓冲区的位置 
display(Buffer); 
tail++; 
count++; 
cout<<"按ENTER继续...."<<endl; 
ch=getchar(); 
ReleaseMutex(hMutex); //结束临界区 
PulseEvent(hNotEmptyEvent); //唤醒消费者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//p2 
void p2_Producer() 
{ 
int i; 
char ch; 
char p2[]={'0','1','2','3','4','5','6','7','8','9'}; 
if(tail<15){ 
for(i=0;i<10;i++){ 
while(1) { 
ch=getchar(); 
WaitForSingleObject(hMutex,INFINITE); 
if(count==BufferSize){ // 缓冲区满 
ReleaseMutex(hMutex); 
// 等待直到缓冲区非满 
WaitForSingleObject(hNotFullEvent,INFINITE); 
continue; 
} 
// 得到互斥锁且缓冲区非满,跳出while循环 
break; 
} 
if (tail>14){ 
cout<<"缓冲区已满,不能再存入数据!程序结束!"<<endl; 
ReleaseMutex(hMutex); //结束临界区 
PulseEvent(hNotEmptyEvent); //唤醒消费者线程 
} 
else{ 
// 得到互斥锁且缓冲区非满,开始产生新数据 
cout<<"Producer p2:\t"<<p2<<endl; 
Buffer[tail]=p2; 
//tail=(tail+1)%BufferSize; 
display(Buffer); 
tail++; 
count++; 
cout<<"按ENTER继续...."<<endl; 


ch=getchar(); 
ReleaseMutex(hMutex); // 结束临界区 
PulseEvent(hNotEmptyEvent); // 唤醒消费者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//p3 
void p3_Producer() 
{ 
int i; 
char ch; 
char p3[]={'!','#','$','%','&','*','+','-','.','/'}; 
if(tail<15){ 
for(i=0;i<10;i++){ 
while(1) { 
ch=getchar(); 
WaitForSingleObject(hMutex,INFINITE); 
if(count==BufferSize){ // 缓冲区满 
ReleaseMutex(hMutex); 
// 等待直到缓冲区非满 
WaitForSingleObject(hNotFullEvent,INFINITE); 
continue; 
} 
// 得到互斥锁且缓冲区非满,跳出while循环 
break; 
} 
if (tail>14){ 
cout<<"缓冲区已满,不能再存入数据!程序结束!"<<endl; 
ReleaseMutex(hMutex); //结束临界区 
PulseEvent(hNotEmptyEvent); //唤醒消费者线程 
} 
else{ 
// 得到互斥锁且缓冲区非满,开始产生新数据 
cout<<"Producer p3:\t"<<p3<<endl; 
Buffer[tail]=p3; 
//tail=(tail+1)%BufferSize; 
display(Buffer); 
tail++; 
count++; 
cout<<"按ENTER继续...."<<endl; 


ch=getchar(); 
ReleaseMutex(hMutex); // 结束临界区 
PulseEvent(hNotEmptyEvent); // 唤醒消费者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//c1 
void c1_Consumer() 
{ 
int i,j,k; 
char result,ch; 
while(1){ 
ch=getchar(); 
WaitForSingleObject(hMutex,INFINITE); 
if(count==0){ // 没有可以处理的数据 
ReleaseMutex(hMutex); // 释放互斥锁且等待 
// 等待直到缓冲区非空 
WaitForSingleObject(hNotEmptyEvent,INFINITE); 
} 
else {if(Buffer[head]==0) { 
cout<<"Consumer 0: 缓冲区的数据已全消费过一次,消费完毕!"<<endl; 


ReleaseMutex(hMutex); // 结束临界区 
ExitThread(0); 
} 
else { // 获得互斥锁且缓冲区有数据,开始处理 
result=Buffer[head]; 
if(result>64&&result<70){ 
result=result+32; 
cout<<"Consumer c1:(大写->小写)\t "<<result<<endl; 
Buffer[head]='^';// '^'表示数据已被消费 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 

if(result>96&&result<102){ 
result=result-32; 
cout<<"Consumer c1:(小写->大写)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 
if(result>47&&result<58){ 
cout<<"Consumer c1:(显示字符)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer);} 
if(result>32&&result<48){ 
cout<<"Consumer c1:(用符号打印出菱形) "<<endl; 
for(i=1;i<=(9+1)/2;i++) 
{ 
for(j=1;j<=40-i;j++) 
cout<<" "; 
for(k=1;k<=2*i-1;k++) 
cout<<result; 
cout<<endl; 
} 
for(i=1;i<=9/2;i++) 
{ 
for(j=1;j<=40-(9+1)/2+i;j++) 
cout<<" "; 
for(k=1;k<=9-2*i;k++) 
cout<<result; 
cout<<endl; 
} 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 


head=(head+1)%BufferSize; 
count--; 
cout<<"按ENTER继续...."<<endl; 


ch=getchar(); 
ReleaseMutex(hMutex); // 结束临界区 
PulseEvent(hNotFullEvent); // 唤醒生产者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//c2 
void c2_Consumer() 
{ 
int i,j,k; 
char result,ch; 
while(1){ 
WaitForSingleObject(hMutex,INFINITE); 
if(count==0){ // 没有可以处理的数据 
ReleaseMutex(hMutex); // 释放互斥锁且等待 
// 等待直到缓冲区非空 
WaitForSingleObject(hNotEmptyEvent,INFINITE); 
} 
else {if(Buffer[head]==0) { 
cout<<"Consumer 0:缓冲区的数据已全消费过一次,消费完毕!"<<endl; 
ReleaseMutex(hMutex); // 结束临界区 
ExitThread(0); 
} 
else { // 获得互斥锁且缓冲区有数据,开始处理 
result=Buffer[head]; 
if(result>64&&result<90){ 
result=result+32; 
cout<<"Consumer c2:(大写->小写)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 

if(result>96&&result<102){ 
result=result-32; 
cout<<"Consumer c2:(小写->大写)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer);} 
if(result>47&&result<58){ 
cout<<"Consumed c2:(显示字符)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer);} 
if(result>32&&result<48){ 
cout<<"Consumer c2:(用符号打印出菱形) "<<endl; 
for(i=1;i<=(9+1)/2;i++) 
{ 
for(j=1;j<=40-i;j++) 
cout<<" "; 
for(k=1;k<=2*i-1;k++) 
cout<<result; 
cout<<endl; 
} 
for(i=1;i<=9/2;i++) 
{ 
for(j=1;j<=40-(9+1)/2+i;j++) 
cout<<" "; 
for(k=1;k<=9-2*i;k++) 
cout<<result; 
cout<<endl; 
} 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 

head=(head+1)%BufferSize; 
count--; 
cout<<"按ENTER继续...."<<endl; 
ch=getchar(); 
ReleaseMutex(hMutex); // 结束临界区 
PulseEvent(hNotFullEvent); // 唤醒生产者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//c3 
void c3_Consumer() 
{ 
int i,j,k; 
char result,ch; 
while(1){ 
WaitForSingleObject(hMutex,INFINITE); 
if(count==0){ // 没有可以处理的数据 
ReleaseMutex(hMutex); // 释放互斥锁且等待 
// 等待直到缓冲区非空 
WaitForSingleObject(hNotEmptyEvent,INFINITE); 
} 
else {if(Buffer[head]==0) { 
cout<<"Consumer 0: 缓冲区的数据已全消费过一次,消费完毕!"<<endl; 
ReleaseMutex(hMutex); // 结束临界区 
ExitThread(0); 
} 
else { // 获得互斥锁且缓冲区有数据,开始处理 
result=Buffer[head]; 
if(result>64&&result<70){ 
result=result+32; 
cout<<"Consumer c3:(大写->小写)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer);} 

if(result>96&&result<102){ 
result=result-32; 
cout<<"Consumer c3:(小写->大写)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer);} 
if(result>47&&result<58){ 
cout<<"Consumer c1:(显示字符)\t "<<result<<endl; 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 
if(result>32&&result<48){ 
cout<<"Consumer c3:(用符号打印出菱形) "<<endl; 
for(i=1;i<=(7+1)/2;i++) 
{ 
for(j=1;j<=40-i;j++) 
cout<<" "; 
for(k=1;k<=2*i-1;k++) 
cout<<result; 
cout<<endl; 
} 
for(i=1;i<=7/2;i++) 
{ 
for(j=1;j<=40-(7+1)/2+i;j++) 
cout<<" "; 
for(k=1;k<=7-2*i;k++) 
cout<<result; 
cout<<endl; 
} 
Buffer[head]='^'; 
cout<<"'^'表示数据已被消费"<<endl; 
display(Buffer); 
} 
head=(head+1)%BufferSize; 
count--; 
cout<<"按ENTER继续...."<<endl; 


ch=getchar(); 
ReleaseMutex(hMutex); // 结束临界区 
PulseEvent(hNotFullEvent); // 唤醒生产者线程 
} 
} 
} 
} 
////////////////////////////////////////////////////////////////// 
//主函数 
void main() 
{ 
HANDLE hThreadVector[6]; 
DWORD ThreadID; 
count = 0; 
head = 0; 
tail = 0; 
hMutex=CreateMutex(NULL,FALSE,NULL); 
hNotFullEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
hNotEmptyEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
hThreadVector[0]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) p1_Producer,NULL, 0, (LPDWORD)&ThreadID); 
hThreadVector[1]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) c1_Consumer,NULL, 0, (LPDWORD)&ThreadID); 
hThreadVector[3]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) p2_Producer,NULL, 0, (LPDWORD)&ThreadID); 
hThreadVector[4]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) c2_Consumer,NULL, 0, (LPDWORD)&ThreadID); 
hThreadVector[5]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) p3_Producer,NULL, 0, (LPDWORD)&ThreadID); 
hThreadVector[5]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) c3_Consumer,NULL, 0, (LPDWORD)&ThreadID); 
WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE); 
//cout<<"**********************Finish*************************"<<endl; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -