当前位置: 首页 > news >正文

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.lryc.cn/news/111120.html

相关文章:

  • 程序员副业指南:怎样实现年入10w+的目标?
  • excel 计算 分位值
  • mongodb-windows-x86_64-4.4.23-signed.msi
  • 一个SpringBoot 项目能处理多少请求?
  • Shell编程基础(十)读取多行文本到数组 写入多行文本到文件
  • MyBatis学习笔记2
  • spring总结
  • 记录--说一说css的font-size: 0
  • Matlab实现支持向量机算法(附上多个完整仿真源码)
  • AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验
  • [国产MCU]-BL602开发实例-开发环境搭建
  • 春秋云镜 CVE-2020-26048
  • 使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用
  • 一个.NET开发的Web版Redis管理工具
  • javaAPI(四):jdk8中的日期时间API
  • 解决在mybatis中出现的org.apache.ibatis.exceptions.PersistenceException~
  • Vue + ElementUI 实现可编辑表格及校验
  • 中介者模式——协调多个对象之间的交互
  • 启动Flink显示初始化状态怎么解决?
  • VB+SQL采购管理系统设计与实现
  • TBB库中实现协程(coroutine)的源码说明
  • 【CSS弹性盒模型 display:flex;常用参数及常见的布局】
  • golang函数传参——值传递理解
  • Liunx环境下git的详细使用(gitee版)
  • exoplayer的使用-2,与flutter相互通信
  • 【基础类】—类型转换
  • 【云原生】 一文了解docker中的网络
  • 嵌入式开发学习(STC51-15-红外遥控)
  • 代码编辑器实践之vue-codemirror使用
  • Mapstruct