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

怎么使用Event手动管理线程同步

2012-01-26 
如何使用Event手动管理线程同步?我程序里面需要用Event来控制进程同步hEventCreateEvent(NULL,TRUE,FALSE

如何使用Event手动管理线程同步?
我程序里面需要用Event来控制进程同步
hEvent   =   CreateEvent(NULL,TRUE,FALSE,NULL);//第二个参数为TRUE,表示需要手工管理置位

下面是我使用的代码,但是输出总不对,希望高手指点!
#include   "stdafx.h "
#include   <Windows.h>
#include   <iostream>
#include   <cstdlib>
using   namespace   std;

DWORD   WINAPI   ThreadProc1(LPVOID   lpParameter);
DWORD   WINAPI   ThreadProc2(LPVOID   lpParameter);

int   index   =   0;
HANDLE   hEvent   =   NULL;

int   main(int   argc,   char*   argv[])
{
HANDLE   hThrd1;
HANDLE   hThrd2;

hEvent   =   CreateEvent(NULL,TRUE,FALSE,NULL);
SetEvent(hEvent);//事件置位

hThrd1   =   CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
hThrd2   =   CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(hThrd1);
CloseHandle(hThrd2);

Sleep(1000);//等待其他两个线程计算完毕

return   0;
}

DWORD   WINAPI   ThreadProc1(LPVOID   lpParameter)
{
while   (index   <   10)  
{
WaitForSingleObject(hEvent,INFINITE);                   ResetEvent(hEvent);//设置未置位
                                    cout < < "thread   1   is   running.   index   =   " < <index++ < <endl;
SetEvent(hEvent);//重新置位
}
return   0;
}

DWORD   WINAPI   ThreadProc2(LPVOID   lpParameter)
{
while   (index   <   10)  
{
WaitForSingleObject(hEvent,INFINITE);
ResetEvent(hEvent);//设置未置位
cout < < "thread   2   is   running.   index   =   " < <index++ < <endl;
SetEvent(hEvent);
}
return   0;
}

要达到的输出目标就是交替运行1,2线程   index连续增加

[解决办法]
在Main中用自动重置的event. CreateEvent(NULL,FALSE,FALSE,NULL);
并且让主线程等待两线程结束后WaitForMultiObject()再return.不要用Sleep(1000);//等待其他两个线程计算完毕
线程改成如下.
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
while (index < 10)
{
WaitForSingleObject(hEvent,INFINITE); cout < < "thread 1 is running. index = " < <index++ < <endl;
SetEvent(hEvent);//重新置位
Sleep(50);
}
return 0;
}
[解决办法]
#include "stdafx.h "
#include <Windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);

int index = 0;
HANDLE hEvent = NULL;
HANDLE hEvent1 = NULL;

int main(int argc, char* argv[])
{
HANDLE hThrd1;
HANDLE hThrd2;

hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
SetEvent(hEvent);//事件置位
hEvent1 = CreateEvent(NULL,TRUE,FALSE,NULL);

hThrd1 = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
hThrd2 = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(hThrd1);
CloseHandle(hThrd2);

Sleep(1000);//等待其他两个线程计算完毕

return 0;
}

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
while (index < 10)
{


WaitForSingleObject(hEvent,INFINITE); ResetEvent(hEvent);//设置未置位
cout < < "thread 1 is running. index = " < <index++ < <endl;
SetEvent(hEvent1);//重新置位
}
return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
while (index < 10)
{
WaitForSingleObject(hEvent1,INFINITE);
ResetEvent(hEvent1);//设置未置位
cout < < "thread 2 is running. index = " < <index++ < <endl;
SetEvent(hEvent);
}
return 0;
}

[解决办法]
用2个EVENT来控制,一个好了释放另外个,可以保证依次执行

热点排行