多线程同步之事件 -- 2个线程交替打印数字

    有段时间没有接触多线程相关的知识了,难免会遗忘或者生疏。多线程通信和同步相关的知识运用比较广,而且比较常见。今天通过2个线程交替打印数字的例子,来整理下多线程序相关的编程方式。这里2个线程直接通过一个event进行同步。

    我们通过CreateEvent函数创建一个无信号的事件。然后再线程1中通过SetEvent设置该事件为有信号。后续每个线程就是通过WaitForSingleObject函数去等待事件即可。通过交替调用ResetEvent和SetEvent,2个线程相安无事,各自按照顺序进行打印。

    如果没有多线程的控制,那么打印顺序一定是不可预测的,原因是线程的调度由系统决定,某些线程函数执行了2次,可能某些线程函数才执行1次。

    测试代码如下:

    

#include <Windows.h>
#include <iostream>

#include <stdlib.h>
#include <process.h>

using namespace std;

int g_number = 0;
HANDLE g_hEvent = NULL;

unsigned int __stdcall threadFun1(void *param)
{

	SetEvent(g_hEvent);
	while(1)
	{
		DWORD dwWaitResult = WaitForSingleObject(g_hEvent, INFINITE); 

		switch (dwWaitResult) 
		{
			// Event object was signaled
			case WAIT_OBJECT_0: 
			break; 
			// An error occurred
			default: 
			printf("Wait error (%d)\n", GetLastError()); 
			return 0; 
		}

		ResetEvent(g_hEvent);

		printf("threadFun1: g_number = %d\t\r\n",g_number++);
		Sleep(1500);

		SetEvent(g_hEvent);
	}

	return 0;
}

unsigned int __stdcall threadFun2(void *param)
{

	while(1)
	{
		DWORD dwWaitResult = WaitForSingleObject(g_hEvent, INFINITE); 

		switch (dwWaitResult) 
		{
			// Event object was signaled
		case WAIT_OBJECT_0: 
			break; 
			// An error occurred
		default: 
			printf("Wait error (%d)\n", GetLastError()); 
			return 0; 
		}

		ResetEvent(g_hEvent);

		printf("threadFun2: g_number = %d\t\r\n",g_number++);
		Sleep(800);

		SetEvent(g_hEvent);
	}

	return 0;
}

int main(int argc,char* argv[])
{
	g_hEvent =  CreateEvent(NULL,false,false,L"Event Test1");

	HANDLE hThread1 = NULL;
	unsigned threadID1 = 0;

	hThread1 = (HANDLE)_beginthreadex(NULL, 0, threadFun1, NULL, 0, &threadID1);

	HANDLE hThread2 = NULL;
	unsigned threadID2 = 0;

	hThread2 = (HANDLE)_beginthreadex(NULL, 0, threadFun2, NULL, 0, &threadID2);

	while(1);

	return 0;
}
        编译运行代码,结果如下:

        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值