码迷,mamicode.com
首页 > 编程语言 > 详细

线程2:线程通信事件机制(单线程、两个线程、多个线程通信)

时间:2015-08-21 15:41:12      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:线程通信

//一个线程之间的通信
 DWORD WINAPI firstthread(void *p)
 {
 	MessageBoxA(0, "1", "1", 0);
 	printf("第1个线程执行完成\n");
 	SetEvent(event[0]);//发出事件信号
 	return 0;
 }
 DWORD WINAPI secondthread(void *p)
 {
 	WaitForSingleObject(event[0], INFINITE);//等待event信号出现,执行下一步
 	MessageBoxA(0, "2", "2", 0);
 	printf("第2个线程执行完成\n");
 	return 0;
 }
 void main()
 {
 	//SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性。如变成ByVal As Long,并传递零值,则表明使用对象默认的安全设置
 	//Long,如果为TRUE,表示创建一个人工重设事件;如果为FALSE,表示创建一个自动重设事件
 	//Long,如事件应内部进入触发状态,则为TRUE
 	//String,指定事件对象的名字。用vbNullString创建一个未命名事件对象。如已经存在拥有这个名字的一个事件,
	 //则现有的命名事件就会打开。这个名字可能不与一个现有互斥体、信号机、可等待计时器或文件映射的名字相符
 	event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//创建事件
 	event[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
 
 	hthread[0]=CreateThread(NULL, 0, firstthread, NULL, 0, NULL);
 	hthread[1] = CreateThread(NULL, 0, secondthread, NULL, 0, NULL);
 
 	WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
 	printf("线程任务完成\n");
 	system("pause");
 }


//////////////////////////////////////////////////////////////////////////
//两个线程之间的通信
DWORD WINAPI AAA(void *p)
{
	int i = 1;
	printf("AAA第%d次:发出信号aaaaa......\n",i);
	SetEvent(event[0]);//此处作为第一次的发话者  否则会造成死锁
	while (++i)
	{
		WaitForSingleObject(event[1], INFINITE);
		printf("AAA第%d次说:发出信号aaaaa......\n", i);
		SetEvent(event[0]);
		Sleep(1000);
	}
}
DWORD WINAPI BBB(void *p)
{
	int i = 0;
	while (++i)
	{
		WaitForSingleObject(event[0], INFINITE);
		printf("BBB第%d次说:发出信号bbbbb......\n", i);
		SetEvent(event[1]);
		Sleep(1000);
	}
}
void main()
{
	event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
	event[1] = CreateEvent(NULL, TRUE, FALSE, NULL);

	hthread[0] = CreateThread(NULL, 0, AAA, NULL, 0, NULL);
	hthread[1] = CreateThread(NULL, 0, BBB, NULL, 0, NULL);
	WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
	system("pause");
}
技术分享

HANDLE event[4] = { 0 };//事件
HANDLE hthread[3] = {0};//代表线程
CRITICAL_SECTION  cs;

char str[1024] = { 0 };//代表聊天内容的缓冲区
DWORD  WINAPI  zhouruifu(void *p)
{
	int i = 0;
	int k = 0;
	while (++i)
	{
		printf("--------------------\n");
		if (k==0)
		{
			printf("--------------------k=0\n");
			WaitForSingleObject(event[0], INFINITE);
			EnterCriticalSection(&cs);
			printf("\n中介:%d %s",i, str);
			LeaveCriticalSection(&cs);
			Sleep(1000);
			SetEvent(event[1]);//发送给1
			k = 1;
		}
		else 
		{
			printf("--------------------k=1\n");
			WaitForSingleObject(event[2], INFINITE);//等待2
			EnterCriticalSection(&cs);
			printf("\n传递数据:%d %s",i, str);
			LeaveCriticalSection(&cs);
			Sleep(1000);
			SetEvent(event[3]);//发送给3
			k = 0;
		}
	}
}
DWORD WINAPI hello(void *p)
{
	int i =1;
	EnterCriticalSection(&cs);
	memset(str, '\0', 1024);
	sprintf(str, "\nhello第%d次说: i love you world", i);
	LeaveCriticalSection(&cs);
	Sleep(1000);
	SetEvent(event[0]);

	while (++i)
	{
		WaitForSingleObject(event[3], INFINITE);
		EnterCriticalSection(&cs);
		memset(str, '\0', 1024);//清空内容
		sprintf(str, "\nhello第%d次说: i love you world", i);
		LeaveCriticalSection(&cs);
		Sleep(1000);
		SetEvent(event[0]);
	}
	return 0;
}
DWORD WINAPI world(void *p)
{
	int i = 0;
	while (++i)
	{
		WaitForSingleObject(event[1], INFINITE);
		EnterCriticalSection(&cs);
		memset(str, '\0', 1024);
		sprintf(str,"\nworld第%d次说: i love you too", i);
		LeaveCriticalSection(&cs);
		Sleep(1000);
		SetEvent(event[2]);
	}
	return 0;
}
//////////////////////////////////////////////////////////////////////////
//三个线程之间的通信  中介者模式
void  main()
{
	InitializeCriticalSection(&cs);//初始化
	event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//创建事件
	event[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
	event[2] = CreateEvent(NULL, TRUE, FALSE, NULL);
	event[3] = CreateEvent(NULL, TRUE, FALSE, NULL);
	hthread[0] = CreateThread(NULL, 0, hello, NULL, 0, NULL);
	hthread[1] = CreateThread(NULL, 0, world, NULL, 0, NULL);
	hthread[2] = CreateThread(NULL, 0,zhouruifu, NULL, 0, NULL);
	WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
	printf("over");
	DeleteCriticalSection(&cs);
	system("pause");
}
技术分享

版权声明:本文为博主原创文章,欢迎指出代码不良之处,及提出代码优化方案。欢迎指点,黑夜代码,拼命奋斗,努力更新中......

线程2:线程通信事件机制(单线程、两个线程、多个线程通信)

标签:线程通信

原文地址:http://blog.csdn.net/zhouruifu2015/article/details/47834259

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!