C++中实现多线程的三种方式

目录

  • 1 背景
  • 2 方法

1 背景

力扣1116题 打印零和奇偶数。

2 方法

方法1:原子操作

class ZeroEvenOdd {
private:int n;atomic<int> flag = 0;
public:ZeroEvenOdd(int n) {this->n = n;}// printNumber(x) outputs "x", where x is an integer.void zero(function<void(int)> printNumber) {for (int i = 1; i <= n; ++i) {while (flag != 0) {this_thread::yield();}printNumber(0);if (i % 2 == 0) {flag = 2;} else {flag = 1;}}}void even(function<void(int)> printNumber) {for (int i = 2; i <= n; i += 2) {while (flag != 2) {this_thread::yield();}printNumber(i);flag = 0;} }void odd(function<void(int)> printNumber) {for (int i = 1; i <= n; i += 2) {while (flag != 1) {this_thread::yield();}printNumber(i);flag = 0;}}
};

方法2:互斥锁和变量控制

class ZeroEvenOdd {
private:int n;mutex m;condition_variable cv;int flag = 0;
public:ZeroEvenOdd(int n) {this->n = n;}// printNumber(x) outputs "x", where x is an integer.void zero(function<void(int)> printNumber) {for (int i = 1; i <= n; ++i) {unique_lock<mutex> lock(m);cv.wait(lock, [&] {return flag == 0;});printNumber(0);if (i % 2 == 0) {flag = 2;} else {flag = 1;}cv.notify_one();}}void even(function<void(int)> printNumber) {for (int i = 2; i <= n; i += 2) {unique_lock<mutex> lock(m);cv.wait(lock, [&] {return flag == 2;});printNumber(i);flag = 0;cv.notify_one();}}void odd(function<void(int)> printNumber) {for (int i = 1; i <= n; i += 2) {unique_lock<mutex> lock(m);cv.wait(lock, [&] {return flag == 1;});printNumber(i);flag = 0;cv.notify_one();}}
};

方法3:信号量

#include <semaphore.h>class ZeroEvenOdd {
private:int n;sem_t printOdd, printEven, numDone;
public:ZeroEvenOdd(int n) {this->n = n;sem_init(&printOdd, 0, 0);sem_init(&printEven, 0, 0);sem_init(&numDone, 0, 1);}// printNumber(x) outputs "x", where x is an integer.void zero(function<void(int)> printNumber) {for (int i = 1; i <= n; ++i) {sem_wait(&numDone);printNumber(0);if (i % 2 == 0) {sem_post(&printEven);} else {sem_post(&printOdd);}}}void even(function<void(int)> printNumber) {for (int i = 2; i <= n; i += 2) {sem_wait(&printEven);printNumber(i);sem_post(&numDone);}       }void odd(function<void(int)> printNumber) {for (int i = 1; i <=n; i += 2) {sem_wait(&printOdd);printNumber(i);sem_post(&numDone);}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网&#xff1a;https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…

zabbix触发器标签提取监控项子字符串实现对应告警恢复

0 实验环境 zabbix 6.0 1 监控项 1.1 监控项设置 通过zabbix agent自定义监控项&#xff0c;读取某文件内容模拟日志/trap告警&#xff0c;测试获取触发器标签中提取子字符串功能&#xff0c;以及相同标签的触发器自动恢复功能。 1.2 手工运行 手动触发之后&#xff0c;模…

你来问我来答,ChatGPT对话软件测试!主题互动

你来问我来答&#xff0c;ChatGPT对话软件测试&#xff01; 大家好&#xff0c;我是聪明而有趣的ChatGPT。作为IT专家&#xff0c;我将竭尽全力为你解答技术问题&#xff0c;并提供适合各个级别人群理解的解决方案。无论你是初学者还是专业人士&#xff0c;我都会用智能、简单…

在centos7上使用非编译方式安装ffmpeg

很多在centos7上安装ffmpeg的教程都需要使用编译方式的安装&#xff1b;编译时间较长而且需要配置; 后来搜索到可以通过加载rpm 源的方式实现快速便捷操作 第一种方式&#xff1a; 首先需要安装yum源&#xff1a; yum install epel-release yum install -y https://mirrors.…

C++中结构体的构造函数

2023年8月5日&#xff0c;周六上午 在C中&#xff0c;结构体和类是非常相似的&#xff0c;它们都可以具有构造函数。 事实上&#xff0c;在C中&#xff0c;结构体和类之间的唯一区别就是默认的访问权限不同。 结构体可以有默认构造函数、带参数的构造函数、拷贝构造函数等&am…

echarts 图例组件legend配置

legend 图例组件展示不同系列的图表类型标记、颜色、和名称。可以通过点击来控制哪个系列不展示。对于饼图来说&#xff0c;控制哪个数据不展示。 $> echarts5.4.0简单画一个饼图作为示例,设置legend:{show:true}展示图例。 const options {legend: {show: true,},series…

Java List(列表)

List 是一个有序、可重复的集合&#xff0c;集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引&#xff0c;第一个添加到 List 集合中的元素的索引为 0&#xff…

ELK 企业级日志分析系统(ElasticSearch、Logstash 和 Kiabana 详解)

目录 一.ELK简介 1.1ELK的概述 1.2ELK的组成 1.2.1 ElasticSearch 1.2.2 Logstash 1.2.3 Kibana 1.2.4 小总结 1.3可以添加其他组件 1.4filebeat 结合 logstash 带来好处 1.5日志处理的步骤 二.Elasticsearch 2.1Elasticsearch概述 2.2Elasticsearch核心概念 2.2.1接近…

使用可视化docker浏览器,轻松实现分布式web自动化

01、前言 顺着docker的发展&#xff0c;很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试&#xff0c;这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以实现可视化&#xff0c;同时可以对浏览器进行相关的操作。 02、开篇 首先…

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项&#xff1a;--name&#xff1a;为容器命名 -i&#xff1a;交互式创建容器 -d&#xff1a;后台创建容器 -t&#xff1a;为容器分配伪终端 Docker 容器存在的意义就是为…

机器学习笔记之优化算法(六)线搜索方法(步长角度;非精确搜索;Glodstein Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Glodstein Condition] 引言回顾&#xff1a; Armijo Condition \text{Armijo Condition} Armijo Condition关于 Armijo Condition \text{Armijo Condition} Armijo Condition的弊端 Glodstein…

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可独立运行。通常与版本管理工具(SCM)、构…

【设计模式】单例模式

什么是单例模式&#xff1f; 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点 单例模式的应用场景 1.整个程序的运行中只允许有一个类的实例&#xff1b; 2.需要频繁实例化然后销毁的对象。 3.创建对象时耗时过多或者耗资源过多&#xff0c;但又经常用到…

如何在 Rust 中运行 Lua 程序

在Rust中&#xff0c;你可以使用rust-lua这个库来运行Lua程序。下面是一个简单的例子&#xff1a; 首先&#xff0c;将 rust-lua 添加到你的 Cargo.toml 文件中&#xff1a; [dependencies] rust-lua "0.36"然后&#xff0c;在你的Rust代码中&#xff0c;你可以使…

Framework入门02-应用进程

2-1 你知道应用进程是怎么启动的吗? (1) Linux下进程启动的方式 pidfork(),这个方法会返回2次。pid为0时在子进程执行&#xff0c;pid为子进程的进程id时&#xff0c;在父进程执行。若在子进程中&#xff0c;没有execve(path, argv, env)函数&#xff0c;则子进程共享父进程…

阿里云容器服务助力极氪荣获 FinOps 先锋实践者

作者&#xff1a;海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系&#xff0c;自 2013 年起历经十年发展&#xff0c;可信云服务评估体系已日臻成熟&#xff0c;成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…

linux中校验文件的sha256sum值

用途 下载源文件和校验文件进行校验&#xff0c;防止被中间人篡改文件内容。 同理的还有yum仓库&#xff0c;加载第三方库时&#xff0c;要先导入一个key密钥。 sha256校验 这里用helm软件包示例 curl -LO https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gzcurl -LO ht…

【云原生】K8S二进制搭建一

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…

EventBus 开源库学习(二)

整体流程阅读 EventBus在使用的时候基本分为以下几步&#xff1a; 1、注册订阅者 EventBus.getDefault().register(this);2、订阅者解注册&#xff0c;否者会导致内存泄漏 EventBus.getDefault().unregister(this);3、在订阅者中编写注解为Subscribe的事件处理函数 Subscri…

ceil(),floor(),round()函数C++详解

ceil&#xff08;&#xff09; ceil()函数是这样的&#xff1a; double ceil(double x) ceil函数可以把x上取整。 例子&#xff1a; #include <bits/stdc.h> using namespace std; int main() {double a, b;cin >> a >> b;printf("ceil(%.2f) %.2…