生产者-消费者问题...
有A,B,C,D四个线程共享一个缓冲区,其中A是生产者线程负责向缓冲区送数据,B,C,D是消费者线程需要从缓冲区中取数据。A每送一次数据,B,C,D必须都取一次后A才能再向缓冲区中送数据。要求B,C,D从缓冲区中取数据时必须是互斥进行的。哪位大大会做啊,麻烦给我发信息以后留言给我,谢谢!
其他答案
#include <windows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 10;//缓冲区长度 unsigned short ProductID = 0;//产品号 unsigned short ConsumeID = 0;//将被消耗的产品号 unsigned short in = 展开
#include <windows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 10;//缓冲区长度 unsigned short ProductID = 0;//产品号 unsigned short ConsumeID = 0;//将被消耗的产品号 unsigned short in = 0;//产品进缓冲区时的缓冲区下标 unsigned short out = 0;//产品出缓冲区时的缓冲区下标 int g_buffer[SIZE_OF_BUFFER];//缓冲区是个循环队列 bool g_continue = true;//控制程序结束 HANDLE g_hMutex;//用于线程间的互斥 HANDLE g_hFullSemaphore;//当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore;//当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID);//生产者线程 DWORD WINAPI Consumer(LPVOID);//消费者线程 int main() { //创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);//调整下面的数值,可以发现,当生产者个数多于消费者个数时, //生产速度快,生产者经常等待消费者;反之,消费者经常等待 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];//各线程的handle DWORD producerID[CONSUMERS_COUNT];//生产者线程的标识符 DWORD consumerID[THREADS_COUNT];//消费者线程的标识符 //创建生产者线程 for (int i=0;i<PRODUCERS_COUNT;++i){ hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if (hThreads[i]==NULL) return -1;} //创建消费者线程 for (i=0;i<CONSUMERS_COUNT;++i){ hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);if (hThreads[i]==NULL) return -1;} while(g_continue){ if(getchar()){ //按回车后终止程序运行 g_continue = false;} } return 0;} //生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce() { std::cerr <<"Producing "<<++ProductID <<"... ";std::cerr <<"Succeed"<<std::endl;} //把新生产的产品放入缓冲区 void Append() { std::cerr <<"Appending a product ... ";g_buffer[in] = ProductID;in = (in+1)%SIZE_OF_BUFFER;std::cerr <<"Succeed"<<std::endl;//输出缓冲区当前的状态 for (int i=0;i<SIZE_OF_BUFFER;++i){ std::cout <<i <<": "<<g_buffer[i];if (i==in) std::cout <<"<-- 生产";if (i==out) std::cout <<"<-- 消费";std::cout <<std::endl;} } //从缓冲区中取出一个产品 void Take() { std::cerr <<"Taking a product ... ";ConsumeID = g_buffer[out];out = (out+1)%SIZE_OF_BUFFER;std::cerr <<"Succeed"<<std::endl;//输出缓冲区当前的状态 for (int i=0;i<SIZE_OF_BUFFER;++i){ std::cout <<i <<": "<<g_buffer[i];if (i==in) std::cout <<"<-- 生产";if (i==out) std::cout <<"<-- 消费";std::cout <<std::endl;} } //消耗一个产品 void Consume() { std::cerr <<"Consuming "<<ConsumeID <<"... ";std::cerr <<"Succeed"<<std::endl;} //生产者 DWORD WINAPI Producer(LPVOID lpPara) { while(g_continue){ WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);} return 0;} //消费者 DWORD WINAPI Consumer(LPVOID lpPara) { while(g_continue){ WaitForSingleObject(g_hEmptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);} return 0;} 收起
2011-01-25 12:06
来自北京市
赞(0)点赞赞(0)举报
发布评论
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。
回答成功


