用EVent同步主线程和子线程 新手,勿喷

 精通windws api 那本书有个小错误,sleep(2000)应该放在后面,不是前面。加入放在前面的话,在执行SetEvent()函数后,主线程就结束了,而子线程还没来得急读出共享内存的数据就被kill了,所以看不到输入结果。放在后面的话,让主线程等带一段时间,让子线程有时间执行。个人理解,错误地方望大牛指出。
1
#include <iostream> 2 #include <windows.h> 3 using namespace std; 4 #define BUFFER_SIZE 16//共享内存 5 6 HANDLE hEevent; 7 BYTE lpShareBuffer[16]={0}; 8 void UsingEevent(void); 9 DWORD WINAPI EeventFunction(LPVOID lpPara); 10 void main() 11 { 12 UsingEevent(); 13 } 14 void UsingEevent() 15 { 16 HANDLE hThread; 17 hEevent=CreateEvent(NULL,TRUE,FALSE,NULL); 18 if (NULL==hEevent) 19 { 20 cout<<"createevent failed:"<<GetLastError(); 21 return; 22 } 23 hThread=CreateThread(NULL,0,EeventFunction,NULL,0,NULL); 24 if (NULL==hThread) 25 { 26 cout<<"create thread failed:"<<GetLastError(); 27 } 28 29 CopyMemory(lpShareBuffer,"event",sizeof("event")); 30 SetEvent(hEevent); 31 Sleep(2000);//主线程等待,让子线程有时间执行 32 } 33 DWORD WINAPI EeventFunction(LPVOID lpPara) 34 { 35 DWORD dwWaitResult; 36 dwWaitResult=WaitForSingleObject(hEevent,INFINITE); 37 if (dwWaitResult!=WAIT_OBJECT_0 ) 38 { 39 cout<<"wait error:"<<GetLastError()<<endl; 40 return 0; 41 } 42 for (int i=0;i<16;i++)//循环输出内存字符 43 { 44 cout<<lpShareBuffer[i]; 45 } 46 if (!ResetEvent(hEevent))//重设置hEvent 47 { 48 cout<<"reset error:"<<GetLastError(); 49 return 0; 50 } 51 return 1; 52 }
输出结果:

如果有多个子进程,那么子进程的调度与操作系统和cpu个数有关,如下面程序输出结果:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
#define BUFFER_SIZE 16
#define FIVE_EVENTS 5
#define  FIVE_THREADS 5
DWORD WINAPI  ThreadFunction(LPVOID lpPara);
HANDLE hEvent[5];
HANDLE hMainWrite;
BOOL CreateFiveEvent();
BOOL WirteBuffer();
HANDLE hThread;
BYTE ShareBuffer[16]={0};
string strShar;
int main()
{
    CreateFiveEvent();
    return 0;
}
BOOL CreateFiveEvent()
{
    int i;
    for( i=0;i<FIVE_EVENTS;i++)
    {
        hEvent[i]=CreateEvent(NULL,TRUE,FALSE,NULL);
        if (NULL==hEvent[i])
        {
            cout<<"create event failed"<<GetLastError()<<endl;;
        }
        hThread=CreateThread(NULL,0,ThreadFunction,(LPVOID)i,NULL,NULL);
        if (NULL==hThread)
        {
            cout<<"create thread failed"<<endl;
        }
    }    
    hMainWrite=CreateEvent(NULL,TRUE,FALSE,NULL);
    WirteBuffer();
    return 0;
}
BOOL WirteBuffer()
{
    strShar="hello world";
    SetEvent(hMainWrite);
    Sleep(200);
    return 0;
}
DWORD WINAPI ThreadFunction(LPVOID lpPara)
{
    WaitForSingleObject(hMainWrite,INFINITE);
    cout<<""<<"线程读出数据:"<<strShar<<endl;
    ResetEvent(hMainWrite);
    return 0;
}
输出在屏幕结果是不确定的:


 

 

posted on 2013-03-22 18:34  小小--菜鸟  阅读(338)  评论(0编辑  收藏  举报

导航