1418作业(8)多线程 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID 在屏幕上打印10遍

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


my_typedef.h

#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


main.c

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

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <Windows.h>
#include <process.h>

#include "my_typedef.h"

DWORD WINAPI MyProc1(				/* 线程函数 */
	LPVOID lpParam 
	);		

DWORD WINAPI MyProc2(
	LPVOID lpParam 
	);

DWORD WINAPI MyProc3(
	LPVOID lpParam 
	);

HANDLE tHandleThread[3] = {NULL, NULL, NULL};	/* 线程句柄 */
HANDLE  tHandleEvent[3] = {NULL, NULL, NULL};	/* 事件对象句柄 */
DWORD      pThreadId[3] = {0, 0, 0};		/* 线程ID */
INT32		i32DoNoting = 0;

INT32 main(
	void
	)
{
	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] = _beginthreadex(
		NULL, 
		0U, 
		MyProc1, 
		NULL, 
		0U, 
		&pThreadId[0]
	);

	tHandleThread[1] = _beginthreadex(
		NULL, 
		0U, 
		MyProc2, 
		NULL, 
		0U, 
		&pThreadId[1]
	);

	tHandleThread[2] = _beginthreadex(
		NULL, 
		0U, 
		MyProc3, 
		NULL, 
		0U, 
		&pThreadId[2]
	);

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

	/* 关闭事件对象 */
	for (i32I = 0; i32I < 3; ++i32I) 
	{
		i32DoNoting = CloseHandle(tHandleEvent[i32I]); 
	}

	/* 关闭线程 */
	for (i32I = 0; i32I < 3; ++i32I) 
	{
		i32DoNoting = CloseHandle(tHandleThread[i32I]); 
	}

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

	return (0);
}


DWORD WINAPI MyProc1(
	LPVOID lpParam
	)
{
	INT32 i32I = 0;

	for(; i32I < 10; ++i32I)
	{
		WaitForMultipleObjects(2UL, &tHandleEvent[1], TRUE, INFINITE);	/* 等待第二个和第三个线程各打印一次自己的线程ID */
		OSM_Printf("%d ", pThreadId[0]);				/* 打印一次该线程ID */
		i32DoNoting = ResetEvent(tHandleEvent[1]);			/* 将事件对象重置为未激活状态 */
		i32DoNoting = SetEvent(tHandleEvent[0]);			/* 将事件对象变成激发状态 */
	}

	return (0UL);
}

DWORD WINAPI MyProc2(
	LPVOID lpParam
	)
{
	INT32 i32I = 0;
	HANDLE tHandleTempEvent[2];

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

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

	return (0UL);
}

DWORD WINAPI MyProc3(
	LPVOID lpParam
	)
{
	INT32 i32I = 0;

	for(; i32I < 10; ++i32I)
	{
		WaitForMultipleObjects(2UL, tHandleEvent, TRUE, INFINITE);	/* 等待第一个和第二个线程各打印一次自己的线程ID */
		OSM_Printf("%d ", pThreadId[2]);
		i32DoNoting = ResetEvent(tHandleEvent[0]);
		i32DoNoting = SetEvent(tHandleEvent[2]);
	}

	return (0UL);
}



程序截图:



作者:http://blog.csdn.net/lp310018931

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值