三线程顺序打印ABC问题

三个线程按顺序打印ABC 首先思路是一个线程在工作时,需要阻塞另外两个线程,这样需要三个线程共用一个互斥锁,但问题是怎样指定顺序呢。 想到的办法是通过一个全局变量nFlag,以此判断下一个应该打印哪一个字母。 但是如何指定呢,比如A打印完成后,nFlag指定B,而C线程继续等待。 可以在进入互斥锁前设定一个死循环,没有轮到的字母一直阻塞在这里,而轮到的线程进入工作状态。 所以代码如下 // InOrderABC... 阅读详情

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

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

using namespace std;

mutex m; //保护条件的互斥访问
condition_variable cond; //条件变量

int loop = 10;
int flag = 0;

void func(int id) {
    for(int i = 0; i < loop; i++) {
        unique_lock<mutex> lk(m);//使用它来锁住线程
	while(flag !=id)
	    cond.wait(lk);//线程被挂起,等待notify唤醒
	cout << static_cast<char>('A' + id) << " ";
	flag = (flag + 1) % 3;
	cond.notify_all();//唤醒线程
    }
}

int main(int argc, char **argv) {
    cout << "Hello, world!" << std::endl;
    thread threadA(func, 0);
    thread threadB(func, 1);
    thread threadC(func, 2);
    
    cout << endl;
    
    threadA.join();
    threadB.join();
    threadC.join();
    return 0;
}

分析:

条件变量condition_variable用于多线程之间的通信,它可以阻塞一个或同时阻塞多个线程。condition_variable需要与unique_lock配合使用。

当condition_variable对象的某个wait函数被调用的时候,它使用unique_lock(通过mutex)来挂起当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的:condition_variable对象上调用了notification函数来唤醒当前线程。



JAVA经典面试题:四线程写四个文件、三线程循环有序打印ABC 转子:http://blog.0hi.cn/java-classic-interview-question.html 将t1,t2,t3,t4这四个线程分别向4个文件中写入数据,t1写入1,t2写入2,t3写入3,t4写入4,分别在A,B,C,D这4个文件中写入如下内容: A:123412341234B:234123412341C:341234123412 D:4123412 阅读详情

相关推荐

fMRI脑影像特征提取——Pearson相关与低阶功能连接LOFC(dpabi+nilearn)

一个连接由节点和连接强度(边)组成。功能连接中的节点可以是单个体素,也可以是由脑图谱定义的脑区ROI。通常的做法是将脑图谱中多个或者全部ROI作为节点,或者是将脑图谱中单个ROI与全脑体素作为节点。定义连接强度(边),最常用的方式是Pearson相关,两个节点之间可能没有物理连接,但如果他们的BOLD信号同步性很强,则它们之间可能存在很强的功能上的协作,即很强的功能连接,这是一个很好的表征两个节点间关系的特征。

意疏的学习笔记 2万+

C/C++面试:三个线程轮流打印ABC

编写一个程序,开启三个线程,这三个线程按照顺序依次打印ABC,每个字母打印10次后结束,最后结果如 ABCABCABC… 依次递推。

OceanStar的博客 1604

ESP32-CAM图传小车:端边协同的嵌入式视觉系统设计

在物联网边缘智能场景中,嵌入式视觉系统需平衡实时性、算力与成本。其核心在于理解图像采集、硬件编码、低延迟传输与分层计算的基本原理——OV2640等CMOS传感器配合JPEG硬件编码可显著降低主控负载;TCP流式协议比HTTP/RTSP更适配资源受限MCU;而‘计算卸载’架构将OpenCV等重负载移至Android端,使ESP32专注实时控制与传输,既发挥FreeRTOS任务调度优势,又规避了PSRAM带宽与内存瓶颈。该模式广泛适用于教育机器人、智能巡检及DIY视觉终端等场景,本文以WiFi图传坦克小车为载体

weixin_42524864的博客 373

C++条件变量实现多线程顺序打印

最近在学习多线程的网络编程,互斥量和条件变量是多线程编程中常用的线程同步方式。在编写自己的高并发服务器的过程中对互斥量和条件变量进行了封装,想要测试一下自己封装的类是否正确,能否通过自己封装的条件变量类顺利实现多线程顺序打印。 条件变量 先来简单的看一下条件变量的常用接口: int pthread_cond_init(pthread_cond_t *cond, const pthread_cond...

东东儿的博客 2147

2.6 SST的核心性能指标体系

本文构建了固态变压器(SST)的核心性能指标体系,涵盖电气性能、可靠性、经济性和环境适配性四大类指标。电气性能指标包括运行效率(≥97%)、功率密度(≥900kVA/m³)、谐波畸变率(≤3%)等关键参数;可靠性指标设定MTBF≥43800h、年均故障率≤1.2次/年等标准;经济性指标对比分析了初始购置成本(45-55万元)和全生命周期成本(48-55万元);环境适配性指标则明确了温度、海拔等工况要求。该体系采用量化公式和国标限值,为SST的性能测试、选型和优化提供了统一标准。

技术工作者 598

OpenTCS打造移动机器人交通管制系统(四)

先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。 首先需要先明确下OpenTCS内核中的三个概念: 路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。 派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。 调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...

白色冰激凌的技术专栏 5272

三个线程交替顺序打印ABC

题目描述 建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。 5种方法 使用synchronized, wait和notifyAll 使用Lock-&amp;gt;ReentrantLock 和 state标志 使用Lock-&amp;gt;ReentrantLock 和Con...

洞玄之境的博客 2万+

[信号与系统]一阶与二阶连续时间系统和离散时间系统

定义:一阶连续时间系统由一阶线性常系数微分方程描述: dy(t)dt+ay(t)=bx(t) \frac{dy(t)}{dt} + a y(t) = b x(t) dtdy(t)​+ay(t)=bx(t)时间常数:时间常数 τ=1a\tau = \frac{1}{a}τ=a1​ 是系统响应速度的衡量指标。时间常数越小,系统响应越快。冲激响应:一阶系统的冲激响应是指数衰减或增长的形式。例如,对于一个单位冲激输入,响应为: h(t)=bae−at h(t) = \frac{b}{a} e^{-at} h(t)=

Andius的博客 2121

三个线程实现ABC的顺序输出

创建3个线程,让这三个线程按顺序执行,每个线程打印一个字母,eg:执行后的结果是ABC ABC......共执行10次可以给出多种方法,本文给出其中一种方法为:在线程中创建线程先创建一个线程用来输出A,并在第一个线程中创建第二个线程,用第二个线程输出B,并在第二个线程中创建第三个线程,用第三个线程输出C。

2301_79289489的博客 509

【android bluetooth 案例分析 01】【HiCar 详解 3】【hicar时如何交换Wifi参数的】

如果直接使用 L2CAP(不经过 RFCOMM),会需要额外的协议来保证可靠性,而 RFCOMM 天然支持。BLE 广播的数据长度受限(31 字节 / 255 字节扩展),不适合传输复杂的 Wi-Fi 连接参数。使用 RFCOMM 传输参数,可以兼容不同厂商的车机和手机,而无需依赖特殊的蓝牙功能。手机解析这些参数,并使用 Wi-Fi Direct 连接到车机。,然后才能让 Wi-Fi Direct 进行真正的数据传输。,适合传输 Wi-Fi 连接参数等关键数据。,可以安全地交换 Wi-Fi 连接信息。

奔跑吧 android 的博客 1740

58.Sobel边缘检测算子

注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_16S或者CV_32F这种有负数范围的类型,运算结果里的负数也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。如下图所示,对中心像素Z5求取多个方向的灰度差分,对于Z5的8邻域,分为4个方向,即对角线和水平垂直4个方向对:(z1, z9) ,(z2, z8), (z3, z7), (z6, z4) 给定邻域方向梯度矢量g的幅度为:|g| = <像素灰度差分>/<相邻像素的距离>。

twnkie的博客 4884

C++|四种方法解决三线程按顺序轮流打印ABC的问题:互斥锁和条件变量、原子操作、信号量

无锁实现控制打印顺序,但会占用更多的CPU资源,因为线程在等待时处于忙等(busy-waiting)状态。C++20之后引入的库,才使得C++语言级别的信号量实现,编译的时候记得加一个。

糖炒栗子 1329

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

我不允许你不懂条件变量

更多文章分享在个人微信公众号:极客熊猫 欢迎扫码关注: 互斥与同步 在多线程编程中,有两大问题需要解决:互斥和同步。这两个问题经常放在一起说,但它们还是存在一些差别的。 互斥:由于线程间存在共享数据,当多线程并发地对共享数据进行操作(主要是写操作)时,如不加以管理,可能导致数据不一致问题。互斥就是一个共享数据在同一时刻只能被一个线程使用,这样就保证了共享数据的一致性。 同步:同步比互斥要更加严格。互斥只是规定多个线程不能同时使用共享数据,但是对谁先使用谁后使用并没有作出限制;而同步是指线程间存在依赖,它们

极客熊猫 415

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Gemini永久会员 Java多线程打印笔试题解析

同步机制:使用wait()notify()或Condition实现线程间同步共享状态:通过共享变量控制线程执行顺序避免死锁:确保线程在等待条件不满足时能正确释放锁线程安全:确保共享变量的访问是线程安全的性能考虑会唤醒所有等待线程,可能比notify()效率稍低,但在某些场景下是必要的。

m0_37843156的博客 425

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

同程旅游火车票部门面经

技术面 只有一轮,面试官老烟嗓了 0、行锁升级成表锁 1、事务传播机制 2、ThreadLocal会导致内存溢出吗,是弱引用的原因吗 3、三个线程按顺序打印ABC怎么做 4、可重入锁怎么实现 5、spring的启动过程/被谁启动的/入口点 6、linux常用命令 hr面 待遇太低了,是我手里最低的,还不给a ...

石湖一叶 355

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java并发手撕题详解:原理、实现与面试避坑指南

本文总结了Java并发编程面试中4道高频手撕题的精要解析: CAS自旋锁:详解无锁编程原理,提供基于Unsafe类的实现代码,分析其优缺点及ABA问题的解决方案 线程通信: 两线程交替打印奇偶数:演示synchronized+wait/notify的经典用法 三线程顺序打印ABC:展示多线程精确控制技巧 LRU缓存:结合HashMap与双向链表实现O(1)操作的缓存,提供基础版和LinkedHashMap优化版两种实现 面试技巧: 强调先理清思路再编码的重要性 提醒注意虚假唤醒、可见性等常见陷阱 建议结合底

2504_94294476的博客 2759

java并发---三线程打印ABC的问题

似乎是一道经典面试题?实现方法很多,最近用了下java5的并发包,感觉挺好用的,

慢慢来,比较快 1062

面试算法题:三线程循环打印ABC

面试遇到三线程循环打印ABC的题目,当时没写出来,然后经过查阅,进行整理了一下。 1、题目 有A、B、C 三个线程,A线程 输出“A”,B线程 输出“B”,C线程 输出“C”,要求同时启动3个线程,按照顺序输出“ABC”,循环10次,请使用代码实现。 2、问题分析 A、B、C 三个线程;这表示我们要使用多线程同步,有人说了这不废话吗。是的,笔者只是想说,多线程的实现,有几种方式,①继承Threa...

又听凌晨的钟声 4400

三线程按顺序交替打印ABC的四种方法

和帅_db6a关注 2018.11.14 18:58字数 1942阅读 803评论 0喜欢 0 建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。 二、Synchronized同步法 1、基本思路 使用同步块和wait、notify的方法控制三个线程的执行...

大JAVA解决方案 1084

三线程打印ABC

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。这个问题用**Object的wait(),notify()**就可以很方便的解决。 package ljj.bj.test; /** * 三线程打印ABC */ public class ThreeConcurrencyPrint implements Runnable { ...

Jecretariat的博客 266

多线程交替打印ABC的多种实现方法

一、题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Synchronized同步法1、基本思路使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒操作,主要的目的就是ThreadA->Thre

想作会飞的鱼的博客 6万+

java同步三线程打印abc_三线程打印ABC,循环十次的N种实现方式

编写一个程序,开启 3 个线程 A,B,C,这三个线程的输出分别为 A、B、C,每个线程将自己的 输出在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC....方法1,轮询AtomicInteger缺点是轮询白耗CPU,性能很差package com.mocyx.javacc.printer;import org.springframework.stereotype.Co...

weixin_33888685的博客 511

ABC三线程顺序执行

一、Lock锁加Condition实现(推荐) LockABC: class RunMain { public static void main(String[] args) { LockABC lockABC = new LockABC(); new Thread(new Runnable() { @Override ...

yzh_1346983557的博客 737

python两个线程交替打印_三线程按顺序交替打印ABC的四种方法

建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Synchronized同步法1、基本思路使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒操作,主要的目的就是ThreadA->Thread...

weixin_39667626的博客 1352
上一篇: 线程同步互斥机制
下一篇: C++标准库之condition_variable(条件变量)
hblhly
博客等级 码龄15年 4粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值