多线程的顺序执行(1)

该博客探讨如何编写一个程序,通过多线程技术创建3个线程A、B、C,确保它们按顺序(ABC)打印各自ID共10遍。文章可能详细解释了线程同步和事件(Event)的使用来实现这一目标。
摘要由CSDN通过智能技术生成


题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推


my_typedef.h


<span style="font-size:18px;">#ifndef MY_TYPEDEF_H
#define MY_TYPEDEF_H

typedef char CHAR;
typedef signed char INT8;      
typedef signed short INT16;                                                 
typedef	signed int INT32;
//typedef signed long	LONG64;
typedef	unsigned char UINT8;                                               
typedef	unsigned short UINT16;                                                 
typedef	unsigned int UINT32;
//typedef unsigned long ULONG64;
typedef	float FLOAT;                                                 
typedef	double DOUBLE;

#define OSM_Strncpy strncpy
#define OSM_Strncmp strncmp
#define OSM_Strncat strncat
#define OSM_Printf printf
#define OSM_Getchar getchar
#define OSM_Scanf scanf

#endif</span>



main.c


<span style="font-size:18px;"><span style="font-size:14px;">unsigned int __stdcall MyProc1(LPVOID lpParam);
unsigned int __stdcall MyProc2(LPVOID lpParam);
unsigned int __stdcall MyProc3(LPVOID lpParam);

HANDLE tHandleThread[3] = {NULL, NULL, NULL}; //线程句柄
HANDLE tHandleEvent[3]  = {NULL, NULL, NULL}; //事件对象句柄

unsigned int pThreadId[3] = {0, 0, 0}; //线程ID

INT32  i32DoNothing = 0;


INT32 main()
{
	INT32 i32I = 0;
	// 定义3个事件对象,并保存其句柄
	tHandleEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
	tHandleEvent[1] = CreateEvent(NULL, TRUE, TRUE, NULL);
	tHandleEvent[2] = CreateEvent(NULL, TRUE, TRUE, NULL);

	// 创建3个线程,并保存线程句柄
	tHandleThread[0] = (HANDLE)_beginthreadex(NULL, 0, MyProc1, NULL, 0, &pThreadId[0]);
	tHandleThread[1] = (HANDLE)_beginthreadex(NULL, 0, MyProc2, NULL, 0, &pThreadId[1]);
	tHandleThread[2] = (HANDLE)_beginthreadex(NULL, 0, MyProc3, NULL, 0, &pThreadId[2]);

	// 等待3个线程执行完毕,即每个线程打印完毕
	WaitForMultipleObjects(3UL, tHandleThread, TRUE, INFINITE);

	// 关闭事件对象
	for (i32I = 0; i32I < 3; ++i32I)
	{
		i32DoNothing = CloseHandle(tHandleEvent[i32I]);
	}
	// 关闭线程
	for (i32I = 0; i32I < 3; ++i32I)
	{
		i32DoNothing = CloseHandle(tHandleThread[i32I]);
	}

#if 1
	system("pause");
#endif

	return 0;
}

unsigned int __stdcall MyProc1(LPVOID lpParam)
{
	INT32 i32I = 0;
	for (; i32I < 10; ++i32I)
	{
		// 等待第二个和第三个线程各自打印一次自己的线程ID
		WaitForMultipleObjects(2UL, &tHandleEvent[1], TRUE, INFINITE);
		// 打印一次该线程ID
		printf("%d \n", pThreadId[0]);

		// 将事件对象重置为未激活状态
		i32DoNothing = ResetEvent(tHandleEvent[1]);
		i32DoNothing = SetEvent(tHandleEvent[0]);
		// 将事件对象变成激活状态
	}
	return 0UL;
}

unsigned int __stdcall MyProc2(LPVOID lpParam)
{
	INT32 i32I = 0;
	HANDLE tHandleTempEvent[2];

	tHandleTempEvent[0] = tHandleEvent[0];
	tHandleTempEvent[1] = tHandleEvent[2];

	for (; i32I < 10; ++i32I)
	{
		// 等待第一个和第三个线程各打印一次自己的线程ID
		WaitForMultipleObjects(2UL, tHandleTempEvent, TRUE, INFINITE);
		printf("%d \n", pThreadId[1]);
		i32DoNothing = ResetEvent(tHandleEvent[2]);
		i32DoNothing = SetEvent(tHandleEvent[1]);
	}
	return 0UL;
}

unsigned int __stdcall MyProc3(LPVOID lpParam)
{
	INT32 i32I = 0;
	for (; i32I < 10; ++i32I)
	{
		// 等待第一个和第二个线程各打印一次自己的线程ID
		WaitForMultipleObjects(2UL, tHandleEvent, TRUE, INFINITE);
		printf("%d \n", pThreadId[2]);
		i32DoNothing = ResetEvent(tHandleEvent[0]);
		i32DoNothing = SetEvent(tHandleEvent[2]);
	}
	return 0UL;
}</span><strong style="font-size:24px;">
</strong></span>


输出结果





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值