使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印

多线程同步问题,都需要用到监视器,用来监视资源是否可用。C++中使用condition_variable,Java中使用Condition来实现同步。

1. 实现思路

  1. 需要有一个全局变量控制当前该哪个线程访问资源
  2. 调用wait,让出资源使用权
  3. 调用notify,通知线程访问资源

2. C++实现

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

namespace its {

std::mutex mtx; //往输出缓冲区打印内容是临界区,所以不同线程间需要互斥
std::condition_variable cv; //监视输出缓冲区这个资源是否可以被其他线程使用
int index = 1; //用来协调线程

void print_number() {
    std::unique_lock<std::mutex> lck(mtx);
    for (int i = 1; i <= 52; i++) {
        if (index % 3 == 0) { //当打印了两个数字后,需要让字母进程打印
            cv.wait(lck);
        }
        std::cout << i;
        index++;
        cv.notify_all();
    }
}

void print_alphabet() {
    std::unique_lock<std::mutex> lck(mtx);
    for (char i = 'A'; i <= 'Z'; i++) {
        if (index % 3 != 0) { //当打印了一个字母后,需要让数字进程打印
            cv.wait(lck);
        }
        std::cout << i;
        index++;
        cv.notify_all();
    }
}
}

int main() {
    std::thread threads[2];
    threads[0] = std::thread(its::print_number);
    threads[1] = std::thread(its::print_alphabet);

    for (auto &th : threads)
        th.join();
    std::cout << std::endl;
    return 0;
}

3. 参考资料

  1. 关于线程池,看这一篇就够了!

原文地址:https://www.cnblogs.com/wengle520/p/12361431.html

时间: 2024-11-08 17:14:26

使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印的相关文章

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 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_

实现两个线程从0-100交替打印

分享一道多线程面试题,只是拿来练手的,这里通过两种方式去实现0-100交替打印,大家无聊的话,可以瞅两眼. 一.Synchronized实现: public class PrintNumberIncrInSynchronized { private static int number; private static final Object object = new Object(); public static void main(String[] args) { new Thread(()

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

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

两个线程交替打印1-99

参考https://github.com/crossoverJie/JCSprout/blob/master/src/main/java/com/crossoverjie/actual/TwoThread.java从线程方面实现交替打印. public class Test { volatile boolean isEven = false; @org.junit.Test public void testfda() throws InterruptedException { Thread a

多线程面试题之【三线程按顺序交替打印ABC的方法】

建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:"打印完毕" 方法之一:使用Condition等待唤醒机制,代码如下: import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concu

经典面试题——两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现. 场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现. 这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现:场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现.下面针对两个场景做对应的实现. 场景一 场景一中,线程A和线程B交替打印奇数

java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现

一 问题概述 线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的.但是同步线程并不一定是必须要实现互斥的.比如一个线程打印A,一个线程打印B.这两个线程就没有互斥关系,但是提出这么个需求:交替打印A.B .我们一般的解决方案,往往要使用wait()/notify机制. 二 LockSupport 介绍 LockSupport作为一个工具类,主要学习它的方法. park():在线程内调用,表示当前线程自我阻塞,直到获得许

写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z

题目: 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z.要求用线程间的通信. /** * 写两个线程,第一个线程打印1-52,第二个线程打印A-Z,打印结果为12A34B...5152Z */public class ThreadPrinter { // true打印数字,false打印字母 private boolean flag = true; // 打印字母 public synchronized void printNumber

线程笔记一:java线程经典题目:轮流打印

题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程 代码: PrintLetter.java import java.lang.Thread; class MyThread implements Runnable{ //给线程分配三个对象 private Object pre; private Object self; private Num num; public MyThread(Object pr