事件 同步

一、通知类型

 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41232519/article/details/108567154