C++中使用信号量实现交替执行三个线程

c++使用线程将a、b按照交替的顺序进行输出 c++使用线程将a、b按照交替的顺序进行输出线程注意事项单线程操作交替打印a和b多线程操作交替打印a和b程序结果分析 线程注意事项 线程是同步进行的,运行结果不分定义的线程对象调用函数的先后顺序(即线程的执行顺序与语句定义的先后顺序关系不大) //举个例子 --下面的fb和fa都是函数名称 thread tb(fb); //创建了一个线程对象tb,使用函数fb进行线程初始化 thread ta(fa); //创建了一个线程对象ta,使用函数fa进行线程初始化 //这里程序运行可能先执行的是线程ta再执行线 阅读详情

信号量的相关函数

    信号量的类型 sem_t
    int sem_init(sem_t *sem, int pshared, unsigned int value);
        - 初始化信号量
        - 参数:
            - sem : 信号量变量的地址
            - pshared : 0 用在线程间 ,非0 用在进程间
            - value : 信号量中的值

    int sem_destroy(sem_t *sem);
        - 释放资源
    int sem_wait(sem_t *sem);
        - 对信号量加锁,调用一次对信号量的值-1,如果值为0,就阻塞
    int sem_post(sem_t *sem);
        - 对信号量解锁,调用一次对信号量的值+1

开发环境

Ubuntu18.04+vscode
C++标准 gnu14

使用C++的线程类实现 thread

#include<iostream>
#include<semaphore.h>
#include<unistd.h>
#include<thread>
using namespace std;
sem_t semA,semB,semC;//定义信号量

void funA(int n){
    while (--n) {
        sem_wait(&semA);
        cout << "A:" << n << endl;
        sem_post(&semB);
    }
}

void funB(int n){
    while (--n) {
        sem_wait(&semB);
        cout << "B:" << n << endl;
        sem_post(&semC);
    }
}

void funC(int n){
    while (--n) {
        sem_wait(&semC);
        cout << "C:" << n << endl;
        sem_post(&semA);
    }
}

int main(){
    //初始化信号量
    sem_init(&semA,0,1);
    sem_init(&semB,0,0);
    sem_init(&semC,0,0);
    
    //创建3个线程
    thread tidA,tidB,tidC;
    int num=10;//执行次数
    
    tidA=thread(funA, num);
    tidB=thread(funB, num);
    tidC=thread(funC, num);

    //等待线程结束  回收资源
    tidA.join();
    tidB.join();
    tidC.join();

    return 0;
}

编译执行 要加上-lpthread的库 因为thread的内部也是用pthread实现的
在这里插入图片描述

使用C语言中的pthread_creat创建线程

#include<iostream>
#include<semaphore.h>
#include<unistd.h>
#include<pthread.h>
using namespace std;
sem_t semA,semB,semC;//定义信号量

void* funA(void* arg){
    int n=*(int *)arg;
    while (--n) {
        sem_wait(&semA);
        cout << "A:" << n << endl;
        sem_post(&semB);
    }
}

void* funB(void* arg){
    int n=*(int *)arg;
    while (--n) {
        sem_wait(&semB);
        cout << "B:" << n << endl;
        sem_post(&semC);
    }
}

void* funC(void* arg){
    int n=*(int *)arg;
    while (--n) {
        sem_wait(&semC);
        cout << "C:" << n << endl;
        sem_post(&semA);
    }
}

int main(){
    //初始化信号量
    sem_init(&semA,0,1);
    sem_init(&semB,0,0);
    sem_init(&semC,0,0);
    //创建3个线程
    pthread_t tidA,tidB,tidC;
    int num=10;//执行10次
    
    pthread_create(&tidA, NULL, funA, (void *)&num);
    pthread_create(&tidB, NULL, funB, (void *)&num);
    pthread_create(&tidC, NULL, funC, (void *)&num);
    

    //等待线程结束  回收资源
    pthread_join(tidA,NULL);
    pthread_join(tidB,NULL);
    pthread_join(tidC,NULL);
    
    //销毁信号量
    sem_destroy(&semA);
    sem_destroy(&semB);
    sem_destroy(&semC);

    pthread_exit(NULL);

    return 0;
}

编译操作同上,执行的效果相同,

阿里面试官:如何实现三个线程交替循环打印? 问题:如何实现三个线程交替循环打印?示例:线程1打印A,线程2打印B,线程3打印C,要求交替打印,并且可以循环打印。 输出结果类似:ABCABCABC这道题的难度是五颗星,在面试中也会经常遇到,如果是第一次见到这道题,很难在短时间内想出合理的解决方案。 如果只要求交替打印一次的话,实现比较简单,可以用Thread.join()方法,一个线程等待另一个线程执行完成。 现在要求循环打印,就涉及线程间通信,必须要用到锁,一把锁肯定不够。例如线程1释放锁之后,线程2和线程3都可能获取到锁,是随机的,现在要求必须是线 阅读详情

相关推荐

信号量在C++中的应用

在并发编程中,同步是一个复杂且重要的问题。除了互斥量和条件变量外,信号量(semaphore)是另一个常用的同步机制。本文将介绍信号量的概念和在C++中的应用。

夏天的狂风的专栏 1252

C++实现线程间数据共享

一、前言   本博客介绍一个简单的工作:C++实现线程间数据共享。   在某些程序开发中,例如ORB-SLAM2中就是一个4线程的工程,这四个线程之间的工作不同,但需要数据的联系,也就是四个线程中某个线程进行的工作是为了准备另一个线程所需要的数据。这里不多说ORB-SLAM2的细节了,在这方面SLAM有研究的朋友可私聊一下,一起交流学习一下。下面开始介绍本博客的内容。 二、介绍   这里设计两个线...

YY的博客 5120

113_多线程_定义3个不同的信号sem, sem1, sem2, 顺序执行,【可以同步,非人为】

动图: 提前了解: 【callback】中sem先拿到1信号,执行到hello,【sem--】 --> 0, 然后【sem1++】对阻塞在外面的sem1进行激活 【callback_1】中然后【sem1】-->变成1, 执行到world, 【sem1--】-->0,然后【sem2++】对阻塞在外面的sem2进行激活 ---> 变成1 【callback_2】中【sem2】-->变成1, 执行到dear, 【sem2--】-->变成0 ,【sem++ 】对阻塞在外面的se

HanLongXia的博客 320

(转)C++进程间和线程间通信

 进程间和线程间通信   1.许多程序和应用一起工作达到某个共同目的的任务集。每个任务在开始执行前等待前一个任务完成。为了完成共同目标,相关线程或进程必须相互合作与通信。   2.依赖关系:对于任意两个线程或进程,存在4种依赖关系(如图)  (1)通信依赖性:当线程A需要来自线程B的数据进行操作时(单向依赖)  (2)合作依赖性:当线程A需要线程B拥有的资源,而且在线程A可以

喜欢吃一口烤肉的啵啵 3412

UReport2 报表设计器 在线表格

UReport2官网 一、UReport2报表设计器 UReport2是一个开源的可视化报表设计器,功能强大,操作简单,可以实现复杂的报表统计,有各种各样的导出和打印功能,支持导入Excel表格! 1、报表设计器 2、设计一个简单的用户列表展示 二、可编辑表格 扩展了layui的表格,支持多元化数据编辑(单选,多些、日期、下拉联动),开发简单、高效、便捷。有了它就可以轻松开发类似进销存系统的表格录入功能了,用户拿来即用! 三、主从表录......

ejinxian的专栏 2万+

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 150

线程间的同步----利用信号量来实现

#include #include #include #include #include #include sem_t bin_sem; void *thread_funtion(void *arg); char work_area[1024]; int main() { pthread_t a_thread; int res; void *thread_result; r

u010470972的专栏 900

介绍七种常见还危险的病毒(带样本)

简介:能够感染用户计算机bai系统中的.exe、.dll和.html文件,将自身加密以后缀加到目标文件中。样本(源文件):https://wwx.lanzoux.com/iJx4njrpz1c / https://wwx.lanzoui.com/iYRNLwd8ldc。英文名称:Virus.Win32.Viking.A(标准) / Worm.Win32.Fujack.A(标准)英文名称:Net-Worm.Win32.Blaster.A(标准)/ Lovesan.A/ Msblast.A。

2301_78858007的博客 8391

多线程打印ABC

【代码】多线程打印ABC。

zcd1023的博客 155

【AI概念】迁移学习 vs. 域自适应 vs. 域泛化|定义、核心原理、数学表达、易混淆点与工程选择建议|实际案例、工程实现细节、未来研究趋势、实际应用场景

大家好,我是爱酱。本篇将会详细梳理迁移学习(Transfer Learning)、域自适应(Domain Adaptation)、域泛化(Domain Generalization)三大常被混淆的核心概念,结合数学公式、典型算法与实际应用场景,帮助你厘清它们的本质区别、联系与工程意义。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 2467

鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的预测模型(WOA-GRU)及其Python和MATLAB实现

Python和MATLAB的实现均突出模型结构和优化过程。2. **全局搜索与局部搜索结合**:WOA在寻优时,既有全局搜索的能力,又具备局部精准搜索的能力,能有效避免陷入局部最优解。2. **简化结构**:与长短期记忆(LSTM)相比,GRU的结构更为简化,避免了多层细胞结构,提高了计算效率。4. **使用WOA进行优化**:通过WOA迭代优化GRU模型中的参数,如学习率、批量大小和GRU单元的权重。3. **良好的表现**:GRU在多个时序数据序列的预测任务中表现优异,特别是在较短的数据序列中。

qq_45441438的博客 1323

C/C++两个线程交替执行

C/C++利用互斥锁和信号量实现两个线程交替执行

maoxiaolele的博客 2477

yolov5 部署jetson nano(通用) 保姆级教学

Jetson nano从配置环境到yolov5成功推理检测全过程 文章目录Jetson nano从配置环境到yolov5成功推理检测全过程一、烧录镜像二、配置环境并成功推理1.更新系统和包2、配置环境2.1 配置CUDA2.2 修改Nano板的显存1.打开终端输入:2.修改nvzramconfig.sh文件:3.重启:4.终端输入:3、安装archiconda(也就是jetson nano板上的anaconda)1.下载地址:2.安装:3.测试conda:4.创建运行yolov5的虚拟环境:5.在conda

weixin_44312422的博客 3万+

【c++】【线程】【信号量】三个线程顺序打印1--100

这样可以确保在后续的代码中,只有获得该锁的线程能够进入临界区,从而防止多个线程同时访问共享资源导致数据竞争。是 C++ 标准库中用于管理互斥锁(mutex)的一个对象创建语句,它在作用域内自动管理锁的获取与释放。,你可以确保进入临界区的代码在离开作用域时自动释放锁,从而避免死锁和资源泄漏问题。这会唤醒线程 A,使其结束等待,重新获取锁后检查条件,然后继续执行后续代码。当 unique_lock 对象离开作用域时,自动释放锁。当线程 B 修改了某个数据,并使。的构造函数会自动调用。当执行到这行代码时,

m0_64014551的博客 1488

第14.5章 高翔博士最新开源框架Lightning-LM源码解读(五):揭秘位姿图优化核心模块,从数学原理到代码实现

本文介绍了Lightning-LM框架中的位姿图优化(PGO)模块实现。该模块通过融合多源定位信息(激光定位、激光里程计、DR等),构建并优化位姿图来获得更精确的位姿估计。 主要内容包括: 模块概况与数据流程:初始化配置→添加PGO帧→分配位姿→优化求解→更新位姿→滑动窗口 16个核心函数详解:从构造函数到边缘化处理,涵盖完整的PGO工作流程 关键技术点:噪声参数设置、优化问题构建、约束添加、异常值处理等 关键数据结构:帧队列管理、顶点和边构建、优化统计信息收集 该PGO模块采用增量式优化方式,支持多种约束

行知SLAM 1216

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 174

C++使用多线程交替打印1~10

C++使用多线程交替打印1~10 使用多线程交替打印1-10,线程1打印奇数,线程2打印偶数,有两种方式实现,一种是使用信号量(即互斥锁),另一种是不使用互斥量,人为控制number的读写。 以下为个人想法,可能有错误:   这是一个面试很常见的题目,要求交替打印,使用互斥量的原理很简单,就是确保一个线程在对number进行操作的时候给number上锁,使得其他线程不能访问number,必须等该线...

AlwaySimple的博客 5825

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c++ 多线程交替打印(线程同步)三种方式。

原子操作、条件变量和信号量是并发编程中用于同步和互斥的几种机制。原子操作是指不会被线程调度机制打断的操作,一旦开始执行,就会一直运行到结束,中间不会有任何上下文切换。原子操作通常用于实现对共享资源的无锁访问,例如,对一个计数器的自增操作。C++11引入了模板类,用于支持原子类型和原子操作。更多内容(原子操作,thread,function,bind 等相关资料)和资料:可以参考:条件变量是一种同步机制,允许线程等待某个条件的发生。它通常与互斥量一起使用,以确保在等待条件时对共享资源的访问是互斥的。

cat_fish_rain的博客 1709

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Linux】巧妙运用<信号量>控制两个线程之间的<执行顺序>(思维导图&代码演示&思路解析)

回顾信号量&信号量互斥实验,信号量实现之间谁先执行

YYDsis的博客 1302

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【C++】多线程

C++,多线程

qq_72680384的博客 3156

自己思考出来的一种实现多线程交替工作的方式

自己思考出来的一种实现多线程交替工作的方式 多线程协同工作,一般会用到信号量。但有没有简单点的方式来实现呢?我发现这个不用信号量也是可以实现的(虽然还是推荐信号量…),做法就是加一个标志位,用while循环控制两个线程的阻塞。 代码见下: #include <iostream> #include <thread> #include <windows.h> u...

IcdKnight的博客 330

C++11和POSIX线程库线程互斥与线程同步编程(锁,条件变量,信号量)

文章目录完成两个线程通过条件变量实现交替打印的控制锁+条件变量二元信号量对比一下条件变量和二元信号量按序打印条件变量版二元信号量版生产者消费者条件变量+锁(C++11)多元信号量(有点绕)条件变量和多元信号量的对比 前言:用一些习题来说明这三个东西怎么写。说实话,编写线程同步代码并不简单。 完成两个线程通过条件变量实现交替打印的控制 锁+条件变量 不管是C++11还是POSIX,套路都是一样的 首先要强调的两点: 1.缓冲区队列是临界资源,因此进入就要加锁 2.条件变量是临界资源,进行判断条件是否满足和

m0_51641706的博客 1421

两种方法实现两个线程交替执行(C/C++)

信号量控制两个线程交替执行代码: #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<semaphore.h> #include<pthread.h> #include<stdbool.h> sem_t sem;//控制函数线程的信号量 sem_t sem1;//控制主线程的信号量 bool flag=1;//用来判断函数线程是否退出循环体,1表示没有.

sinat_32152141的博客 3270

交替打印FooBar

题目:https://leetcode-cn.com/problems/print-foobar-alternately/submissions/ 打印保持顺序,与按序打印类似。 1.用两个信号量解决。 由于c++中没有原生信号量,所以用mutex和条件变量实现一个。 class Semaphore { public: Semaphore(int value = 1) :count(val...

罗布泊coding 671

多线程之信号量(By C++)

多线程之信号量(By C++)

ucliaohh的专栏 264

【c++】c++11线程库(二)条件变量condition_variable,两个线程交替打印奇数和偶数

一、前置知识 二、条件变量condition_variable 三、两个线程交替打印奇数和偶数 方案一 方案二 方案三 四、方案三的解释 场景一 场景二

重铸自身根基的博客 821
上一篇: Linux C中互斥量的使用
下一篇: io多路复用中的select函数详解
nuaa蟑螂恶霸
博客等级 码龄8年 21粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值