首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

生产者与消费者//事件与wait函数一行使用为什么不行

2012-10-18 
生产者与消费者//事件与wait函数一起使用为什么不行?事件处于无信号状态,if(size6),wait函数就处于堵塞

生产者与消费者//事件与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的值不定的)。

不知道楼主明白我的意思了么。

热点排行