三个线程打印ABC10次,ABCABCABC....

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include<string>

using namespace std;

HANDLE hEventA;
HANDLE hEventB;
HANDLE hEventC;

DWORD WINAPI funproc(LPVOID lpparentet)
{
    string  s = (char * )lpparentet;
    int count = 0;

    string sA = "A";
    string sB = "B";
    string sC = "C";

    while (count < 10)
    {
        Sleep(100);
        if (sA.compare(s)==0)
        {
            DWORD dwRet = WaitForSingleObject(hEventA, INFINITE);
            if (dwRet == WAIT_OBJECT_0)
            {
                printf("A");
                count++;
                SetEvent(hEventB);
            }
        }

        if (sB.compare(s) == 0)
        {
            DWORD dwRet = WaitForSingleObject(hEventB, INFINITE);
            if (dwRet == WAIT_OBJECT_0)
            {
                printf("B");
                count++;
                SetEvent(hEventC);
            }
        }

        if (sC.compare(s) == 0)
        {
            DWORD dwRet = WaitForSingleObject(hEventC, INFINITE);
            if (dwRet == WAIT_OBJECT_0)
            {
                printf("C");
                count++;
                SetEvent(hEventA);
            }
        }
    }

    return 0;
}

int main()
{
    hEventA = CreateEvent(NULL, false, true, NULL);
    hEventB = CreateEvent(NULL, false, false, NULL);
    hEventC = CreateEvent(NULL, false, false, NULL);

    HANDLE hThreadA = CreateThread(NULL, 0, funproc, "A", 0, NULL);
    HANDLE hThreadB = CreateThread(NULL, 0, funproc, "B", 0, NULL);
    HANDLE hThreadC = CreateThread(NULL, 0, funproc, "C", 0, NULL);

    Sleep(10000);

    return 0;
}
时间: 2024-10-10 11:43:56

三个线程打印ABC10次,ABCABCABC....的相关文章

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

三个线程循环打印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

C#编程总结(三)线程同步

C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力.否则,在完全满足前一个请求之前,将无法处理每个新请求.然而,线程的异步特性意味着必须协调对资源(如文件句柄.网络连接和内存)的访问.否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作. "如果觉得有用,请帮顶! 如果有

第三章线程同步辅助类

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第三章线程同步辅助类 3.1简介 ?信号量(Semaphore):是一种计数器,用来保护一个或者多个共享资源的访问.它是并发编程的一种基础工具,大多数编程语言都提供了这个机制. ? CountDownLatch:是Java语言提供的同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许线程一直等待. ? CyclicBarrier也是Java语言

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

java多线程学习(三)——线程栈

一.线程栈模型 线程栈模型是理解线程调度原理以及线程执行过程的基础.线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶,线程栈的内容是随着线程的运行状态变化而变化的,研究线程栈必须选择一个运行的时刻(指代码运行到什么地方) 上图中的栈A是主线程main的运行栈信息,当执行new JavaThreadDemo().threadMethod();方法时,threadMethod方法位于主线程栈中的栈顶,在threadMethod方法中运行的start()方法新建立了一个线程,此时,

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次. 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程.这里用一个Lock对象来控制三个线程的同步.用一个int型变量state标识由那个线程输出. 1 package com.thread; 2 3 import java.util.concurrent.locks.Lock;

现有T1、T2、T3三个线程,你怎样保证T2在T1执行完成之后执行,T3在T2执行完后执行?

考察join /**  * 现有T1.T2.T3三个线程,你怎样保证T2在T1执行完成之后执行,T3在T2执行完后执行?  * @author user  *  */ public class Test3 { public static void main(String[] args) throws InterruptedException { Thread T1 = new Thread(new T1()); Thread T2 = new Thread(new T2()); Thread T

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处于创建状态. 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源. 2.可运行状态: 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable). 这一