logo资料库

多进程同步解决生产者消费者问题(c++源码).doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
1. 生产者-消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra 提出,用以演示他提 出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将 物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放 缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费 者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者 线程将被阻塞,直到新的物品被生产出来。 #include #include const unsigned unsigned unsigned unsigned unsigned short short short short short ProductID ConsumeID 0; in out 0; = = SIZE_OF_BUFFER = = 0; 0; //缓冲区长度 = 10; //产品号 //将被消耗的产品号 //产品进缓冲区时的缓冲区下标 //产品出缓冲区时的缓冲区下标 //缓冲区是个循环队列 //控制程序结束 //用于线程间的互斥 //当缓冲区满时迫使生产者等待 //当缓冲区空时迫使消费者等待 int bool HANDLE HANDLE HANDLE g_buffer[SIZE_OF_BUFFER]; g_continue true; = g_hMutex; g_hFullSemaphore; g_hEmptySemaphore; DWORD WINAPI DWORD WINAPI Producer(LPVOID); Consumer(LPVOID); //生产者线程 //消费者线程 int main() { //创建各个互斥信号 g_hMutex g_hFullSemaphore = = CreateMutex(NULL,FALSE,NULL); CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //调整下面的数值,可以发现,当生产者个数多于消费者个数时, //生产速度快,生产者经常等待消费者;反之,消费者经常等待 const PRODUCERS_COUNT unsigned short 3; = //生产者的个 数 个数 const unsigned short CONSUMERS_COUNT = 1; //消费者的 //总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE DWORD DWORD hThreads[PRODUCERS_COUNT]; producerID[CONSUMERS_COUNT]; consumerID[THREADS_COUNT]; //各线程的 handle //生产者线程的标识符 //消费者线程的标识符 //创建生产者线程 for (int i=0;i
std::cerr << "Succeed" << std::endl; //输出缓冲区当前的状态 for (int std::cout if if std::cout (i==in) (i==out) << std::cout std::cout std::endl; i i=0;i
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; 2. #includewindows.h #includeiostream.h #includestdio.h HANDLE hMutex; HANDLE hFull, hEmpty; HANDLE p,c; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int a[100],i,j; void main() { cout 生产者消费者问题 endl; a[100]=i=j=0; hMutex=CreateMutex(NULL,FALSE,NULL); hFull=CreateSemaphore(NULL,0,1,NULL); hEmpty=CreateSemaphore(NULL,1,1,NULL); p=CreateThread(NULL,0,Producer,NULL,0,NULL); c=CreateThread(NULL,0,Consumer,NULL,0,NULL);
Sleep(150000); } void Produce(){ cout<<生产者生产产品<
3. #include #include #include #include using namespace std; #define MAX_SIZE 200 char int int int int buffer[MAX_SIZE]; in=0; out=0; counter=0; inUse=0; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main() { HANDLE DWORD ThreadId; hTrd; hTrd=CreateThread(NULL,0,Producer,(LPVOID)('A'),0,&TreadId); if(hTrd) { cout << "thread function " << 'a' <<" Lunched"<
buffer[in++]=(char)m; in%=MAX_SIZE; cout "in" inUse=1;//(1) << << (char)m << endl; } //(1) } } DWORD WINAPI { Producer(LPVOID m) char m; while(1) { if(inUse==1) { m=buffer[out++]; out%=MAX_SIZE; cout << << in out << counter << inUse << endl ; } } inUse=0;//(2) } //(2)
分享到:
收藏