开启3个线程依次打印ABC10次

题目:

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

#include <stdio.h>
#include <windows.h>
#include<iostream>
#include <process.h>
#include <time.h>
using namespace std;

HANDLE g_a, g_b, g_c;
CRITICAL_SECTION g_cs;

unsigned int __stdcall PrintA(void* pM)
{
	int i = 0;
	while (i < 10)
	{
		WaitForSingleObject(g_a, INFINITE);
		EnterCriticalSection(&g_cs);
		cout <<i+1<< ": A";
		SetEvent(g_b);
		++i;
		LeaveCriticalSection(&g_cs);
	}
	return 0;
}

unsigned int __stdcall PrintB(void* pM)
{
	int i = 0;
	while (i < 10)
	{
		WaitForSingleObject(g_b, INFINITE);
		EnterCriticalSection(&g_cs);
		cout << 'B';
		SetEvent(g_c);
		++i;
		LeaveCriticalSection(&g_cs);
	}
	return 0;
}

unsigned int __stdcall PrintC(void* pM)
{
	int i = 0;
	while (i < 10)
	{
		WaitForSingleObject(g_c, INFINITE);
		EnterCriticalSection(&g_cs);
		cout << "C\n";
		SetEvent(g_a);
		++i;
		LeaveCriticalSection(&g_cs);
	}
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&g_cs);
	g_a = CreateEvent(NULL, FALSE, TRUE, NULL);
	g_b = CreateEvent(NULL, FALSE, FALSE, NULL);
	g_c = CreateEvent(NULL, FALSE, FALSE, NULL);
	HANDLE threads[3];

	threads[0] = (HANDLE)_beginthreadex(NULL, 0, PrintA, NULL, 0, NULL);
	threads[1] = (HANDLE)_beginthreadex(NULL, 0, PrintB, NULL, 0, NULL);
	threads[2] = (HANDLE)_beginthreadex(NULL, 0, PrintC, NULL, 0, NULL);

	WaitForMultipleObjects(3, threads, TRUE, INFINITE);

	CloseHandle(g_a);
	CloseHandle(g_b);
	CloseHandle(g_c);
	CloseHandle(threads[0]);
	CloseHandle(threads[1]);
	CloseHandle(threads[2]);
	DeleteCriticalSection(&g_cs);

	cout << endl;
	system("pause");
	return 0;
}
时间: 2024-11-08 17:04:07

开启3个线程依次打印ABC10次的相关文章

三个线程循环打印ABC10次的几种解决方法

题目:有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕打印10次ABC 整体思路:该问题为三个线程的同步唤醒机制即ThreadA->ThreadB->ThreadC->ThreadA循环执行三个线程. public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private Thread thread; pub

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

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

C# 3个线程A B C 依次打印123123123..

C#经典面试题: 有3个线程,A线程打印1,B线程打印2,C线程打印3,请用程序实现依次打印123123123... 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var mt = new MyThread(); 6 mt.Run(); 7 8 Console.ReadLine(); 9 } 10 } 11 12 13 internal class MyThread 14 { 15 private int number =

开启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

c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化

请编写一个程序,实现对于给定的正整数N,依次打印出小于等于N的所有素数. 方法一:试除法 由素数的定义得到如下程序: #include<stdio.h> int print_prime(int num)//prime表示素数 { int i = 0; for (i = 2; i <= num; i++) { int j = 0; for (j = 2; j < i; j++) { if (i%j == 0) { break; } } if (i==j) { printf("

Java多线程通信之两个线程分别打印AB各10次

一道经典的面试题目:两个线程,分别打印AB,其中线程A打印A,线程B打印B,各打印10次,使之出现ABABABABA.. 的效果 1 package com.shangshe.path; 2 3 public class ThreadAB { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 10 final Print business = new Print(); 11 12 new Threa

Java n个线程轮流打印数字的问题

一. 实现两个线程.轮流打印出数字.例如以下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.uti

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. 写了两个版本,一个是用了mutex,不用条件变量:另外一个是用条件变量. 第一个,不用条件变量 1 #include <stdio.h> 2 #include <string.h> 3 #include <pthread.h> 4 5 6 7 const int LOOP_

Java-两个线程轮流打印数字的问题

实现两个线程,轮流打印出数字,如下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.util.con