一、通知类型
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
);
1、创建一个事件CreateEvent()
,定义一个全局变量
HANDLE g_hEvent;
g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
2、创建两个线程
HANDLE ArrhThread[2];
ArrhThread[0] = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
3、设置事件通知类型
SetEvent(g_hEvent);
4、等待线程结束,销毁内核对象
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
5、创建线程内容
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
WaitForSingleObject(g_hEvent,INFINITE);
printf("执行ThreadProc1\n");
getchar();
return 0;
}
完整代码
#include "stdafx.h"
#include "windows.h"
HANDLE g_hEvent;
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
WaitForSingleObject(g_hEvent,INFINITE);
printf("执行ThreadProc1\n");
getchar();
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
//等待线程发生变化
WaitForSingleObject(g_hEvent,INFINITE);
printf("执行ThreadProc2\n");
getchar();
return 0;
}
int main(int argc, char* argv[])
{
//创建一个事件对象,默认安全属性 、TRUE通知/FALSE互斥、初始状态、名字
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
//创建线程
HANDLE ArrhThread[2];
ArrhThread[0] = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
//设置事件为通知
SetEvent(g_hEvent);
//等待线程结束,关闭句柄
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
getchar();
return 0;
}
二、同步
1、定义全局变量g_hSet , g_hClean来接受事件句柄;g_state来获取状态
2、创建两个事件并用g_hSet , g_hClean接受句柄
g_hSet = CreateEvent(NULL,FALSE,true,NULL);
g_hClean = CreateEvent(NULL,FALSE,FALSE,NULL);
3、创建两个线程
HANDLE ArrhThread[2];
ArrhThread[0] = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
4、等待线程结束,销毁内核对象
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
5、创建线程内容
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
for(int i=0;i<10;i++)
{
WaitForSingleObject(g_hSet,INFINITE);
g_state = 1;
DWORD id = GetCurrentThreadId();
printf("生产者%d将数据%d放到缓冲区中\n",id,g_state);
SenVent(g_hClean);
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
for(int i=0;i<10;i++)
{
WaitForSingleObject(g_hClean,INFINITE);
g_state = 1;
DWORD id = GetCurrentThreadId();
printf("消费者%d将数据%d放到缓冲区中\n",id,g_state);
SenVent(g_hSet);
}
return 0;
}
#include "stdafx.h"
#include "windows.h"
HANDLE g_hSet,g_hClean;
int g_state = 0;
//生产者线程
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
for(int i=0;i<10;i++)
{
WaitForSingleObject(g_hSet,INFINITE);
g_state = 1;
DWORD id = GetCurrentThreadId();
printf("生产者%d将数据%d放到缓冲区中\n",id,g_state);
SetEvent(g_hClean);
}
return 0;
}
//消费者线程
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
for(int i=0;i<10;i++)
{
WaitForSingleObject(g_hClean,INFINITE);
g_state = 0;
DWORD id = GetCurrentThreadId();
printf("消费者%d将数据%d放到缓冲区中\n",id,g_state);
SetEvent(g_hSet);
}
return 0;
}
int main(int argc, char* argv[])
{
//创建事件对象
g_hSet = CreateEvent(NULL,FALSE,true,NULL);
g_hClean = CreateEvent(NULL,FALSE,FALSE,NULL);
//创建线程生产者消费者
HANDLE ArrhThread[2];
ArrhThread[0] = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
ArrhThread[1] = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
//等待线程结束,释放句柄
WaitForMultipleObjects(2,ArrhThread,TRUE,INFINITE);
CloseHandle(ArrhThread[0]);
CloseHandle(ArrhThread[1]);
return 0;
}