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
*	   在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC…依次递推。
*******************************************************************************/

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <Windows.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,
		0,
		MyProc1,
		NULL,
		0,
		&pThreadId[0]
	);

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

	tHandleThread[2] = _beginthreadex(
		NULL,
		0,
		MyProc3,
		NULL,
		0,
		&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]);
	}

	system("pause");

	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

时间: 2024-10-13 21:39:48

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

开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上,要求输出结果必须按ABC的顺序显示:ABCABC

分类: windows编程 C++ 2012-10-27 15:38 3270人阅读 评论(6) 收藏 举报 第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. [cpp] view plaincopy #include <stdio.h> #include <process.h> #include <windows.h> #def

java多线程开启的三种方式

1.继承Thread类,新建一个当前类对象,并且运行其start()方法 1 package com.xiaostudy.thread; 2 3 /** 4 * @desc 第一种开启线程的方式 5 * @author xiaostudy 6 * 7 */ 8 public class Demo1_Thread extends Thread { 9 10 public void run() { 11 for (int i = 0; i < 10; i++) { 12 System.out.pri

多线程开启的三种方式

class Program { static int Test(int i) { Console.WriteLine("test"+i); return 100; Thread.Sleep(10); //让当前线程休眠(暂停当前线程的执行)单位为毫秒ms } static void Main(string[] args) //在main方法中执行 一个线程的执行是从上往下执行的 { //通过委托来开启一个线程 //Func<int,int> a = Test; //IAsy

线程间操作无效: 从不是创建控件"窗体的名称"的线程访问它.

有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数. 问题原因是.net2.0以后拒绝多线程访问空间,避免空间造成死锁.以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true.如果不会好几个线程同时操作一个控件用方法1就可以.如果存在多个线程一起操作控件使用方法2 方法2可以 Invoke(new Method

高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

(1)高并发.任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换(2)并发不高.任务执行时间长的业务要区分开看:a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换(3)并发高.业务执行时间长,解决这种类型任务

python并发编程:多线程-开启线程的两种方式

一 threading模块介绍 multiprocess模块完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 二 开启线程的两种方式 方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print("%s say hello" % name) if __name__ == '__main__': t = Thread(target=sayhi, args=('mik

Java多线程开启三个线程输出ABC10次

最近学多线程,搜了一下,满屏幕的问题都是类似标题那样的,所以就拿这个当开始吧,自己试了一下手, 多次把电脑CPU跑到100%,终于还是写出来了,大体思路为: 声明一个变量,标记三个线程该哪个线程输出,每次输出将该变量+1,判断方式为 变量对3的余数,如果为1-A,2-B, 3-C 1 public class ABC { 2 3 private static int mark = 0; 4 5 private static Object obj = new Object(); 6 7 publi

第五周作业(Java多线程创建的三个方法)

我最近在学习Java中多线程,并且觉得多线程这块在以后的Java开发中显得极为重要,就谈一下Java实现多线程的三种方式. JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值,只有第三种是带返回值的,这种方式一般要求比较高,并且较前两种难一些. 1.继承Thread类实现多线程继承Thread类的本质上也是实现了Runnable接口的一个实

java线程池中以代码的顺序运行,主要是记录一下继承线程池的内容

1.这个是自定义的线程池类,直接上代码 package org.jimmy.threadtest20181121; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutor201811281311 extends ThreadPoolE