生产者与消费者//事件与wait函数一起使用为什么不行?
事件处于无信号状态,if(size==6),wait函数就处于堵塞状态?==0事件设置为有信号,wait就不堵塞,之后wait自动置为无信号状态,等到下一次堵塞?//wait函数为什么没有堵塞呢?
- C/C++ code
#include "windows.h"#include "stdio.h"#include "conio.h"#include <iostream>using namespace std;HANDLE g_hEvent = 0;char stack[6]="";int size=0;void Print(){ int i; for(i=0;i<size;i++) cout<<stack[i]<<' '; cout<<"\n";}int endSign =1;DWORD WINAPI InputProc( LPVOID pParam ){ HANDLE hHandle[1] = {g_hEvent}; for(int i=48;i<81;i++) { if(size==6) WaitForMultipleObjects(1,hHandle, FALSE, INFINITE ); stack[size]=i; size++; // cout<<"Input="<<size<<endl; } endSign=0; return 0;}DWORD WINAPI PrintProc( LPVOID pParam ){ while(1) { while(size==0) SetEvent(g_hEvent); // cout<<"Print="<<size<<endl; Print(); size--; if(!endSign) return 0; } }void Test(){ g_hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); DWORD nID = 0; HANDLE hThread[2] = { 0 }; hThread[0] = CreateThread( NULL, 0, InputProc, NULL,0, &nID); hThread[1] = CreateThread( NULL, 0, PrintProc, NULL,0, &nID); WaitForMultipleObjects( 2, hThread, TRUE, INFINITE ); CloseHandle( hThread[0] ); CloseHandle( hThread[1] ); CloseHandle( g_hEvent );}int _tmain(int argc, _TCHAR* argv[]){ Test(); return 0;}
[解决办法]
楼主,你太绕了,本来WaitForMultipleObjects为了区分多个线程互斥操作。
现在你还在用size做标记来回绕(2个线程虽然启动有先后,但是执行先后很难区分,各自抢占CPU,size的值不定的)。
不知道楼主明白我的意思了么。