如何使用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来控制,一个好了释放另外个,可以保证依次执行