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

条件变量解决同步问题之打印金鱼

说明

本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享)
本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释

问题描述

有三类线程
T1 若干: 死循环打印<
T2 若干: 死循环打印>
T3 若干: 死循环打印_
任务:
对线程同步,使得屏幕打印出<><__><>的组合

状态机

在这里插入图片描述

代码

#include <pthread.h>
#include <iostream>
#include <assert.h>
#include <string>
#include <vector>#define Lock(x) pthread_mutex_lock(x) 
#define UnLock(x) pthread_mutex_unlock(x)// 状态机的状态, 从1开始编号
enum { A = 1, B, C, D, E, F, };
// 构建状态机的
struct rule {int from, ch, to;
};
std::vector<rule> rules = {// <><{A, '<', B},{B, '>', C},{C, '<', D},// ><>{A, '>', E},{E, '<', F},{F, '>', D},// D是打印出一条鱼后停留的状态, // 需要经过'_'到初始状态A, 重新打印鱼{D, '_', A},
};
// 当前状态
int current_state = A;pthread_mutex_t lk = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;/*** 检查当前状态是否又ch这条出边* 返回0表示无法根据ch转移到一个状态
*/
int next(char ch) {// 检查ch是否是当前状态的出边for (const auto& rule : rules) {if (rule.from == current_state && rule.ch == ch) {return rule.to;}}return 0;
}
/*** 检查同步条件是否满足
*/
static int can_print(char ch) {return next(ch) != 0;
}
// 创建12个线程, 每4个打印同种字符
std::string charlib = ".<<<<<>>>>___";void* fish_thread(void* arg) {int id = *((int *)arg);char role = charlib[id];while (true) {// 先上锁Lock(&lk);// 再检查条件变量while (!can_print(role)) {pthread_cond_wait(&cv, &lk);}putchar(role); // Not lock-protected// 更新到下一个状态current_state = next(role);assert(current_state);// 更新状态后可能会使得等待该条件的线程满足条件pthread_cond_broadcast(&cv);UnLock(&lk);}
}int main() {std::vector<pthread_t> threads(charlib.size());std::vector<int> pid(charlib.size());for (int i = 0; i < charlib.size(); i++) {pid[i] = i + 1;pthread_create(&threads[i], nullptr, &fish_thread, &pid[i]);}for (int i = 0; i < charlib.size(); i++) {pthread_join(threads[i], nullptr);}
}

相关文章:

条件变量解决同步问题之打印金鱼

说明 本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享) 本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释 问题描述 有三类线程 T1 若干: 死循环打印< T2 若干: 死循环打印> T3 若干: 死循环打印_ 任务: 对线程同步&#xff0c;使得屏幕…...

10分钟了解Golang泛型

泛型是Golang在1.18版本引入的强大工具&#xff0c;能够帮助我们在合适的场合实现简洁、可读、可维护的代码。原文: Go Generics: Everything You Need To Know 导言 可能有人会觉得Go泛型很难&#xff0c;因此想要借鉴其他语言&#xff08;比如Java、NodeJS&#xff09;的泛型…...

鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口

系列篇从内核视角用一句话概括shell的底层实现为&#xff1a;两个任务&#xff0c;三个阶段。其本质是独立进程&#xff0c;因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry)&#xff1a; 负责接受来自终端(控制台)敲入的一个个字符&…...

TypeScript在前端项目的渐进式采用策略

渐进式采用 TypeScript 在前端项目中的策略通常包括: 引入TypeScript 如果我们有一个简单的JavaScript模块utils.js&#xff0c;它包含一个函数用于计算两数之和&#xff1a; // utils.js export function add(a, b) {return a b; }首先&#xff0c;我们将文件扩展名改为.t…...

C++容器常用集合(附传送门)

C常用的容器&#xff1a; string容器 C容器——string-CSDN博客 储存字符串的 vector容器 C容器——vector-CSDN博客 向量是动态数组&#xff0c;可以自动扩展以容纳更多元素。 插入和删除元素的时间复杂度取决于操作的位置 tuple容器&#xff08;元组&#xff09; C容器…...

基于springboot的校园资料分享平台源码数据库

基于springboot的校园资料分享平台源码数据库 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…...

卷积神经网络(CNN)

大家好&#xff0c;这里是七七&#xff0c;今天来更新关于CNN相关的内容同了。本文是针对CNN原理的说明&#xff0c;但对于小白不是非常友好&#xff0c;建议先掌握神经网络相应知识再进行阅读哦。 一、卷积与互相关 卷积 卷积运算是对两个函数进行的一种数学运算&#xff0c…...

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…...

无障碍Web开发:遵循WCAG标准构建包容性用户体验

无障碍Web开发旨在确保所有用户&#xff0c;无论其身体条件或能力如何&#xff0c;都能轻松、有效地访问和使用Web内容。遵循Web Content Accessibility Guidelines (WCAG) 标准是实现这一目标的关键。以下是一些基于WCAG标准的无障碍Web开发实践&#xff0c;以构建更具包容性的…...

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…...

对象定义成final类型还能改变吗

如果一个Java对象被定义为final类型&#xff0c;那么它的引用不能被改变&#xff0c;但是对象本身的状态仍然可以被修改。这意味着你可以改变final对象的属性&#xff0c;但是不能将其引用指向另一个对象。 例如&#xff0c;下面的代码中&#xff0c;虽然person对象被声明为fi…...

Vue Router 路由hash和history模式

文章目录 hash和history模式区别Hash 模式History 模式 在 Vue 中&#xff0c;路由的两种主要模式是 hash 和 history&#xff0c;默认的路由模式是hash模式。。这两种模式决定了 URL 的外观以及浏览器如何处理 URL 的变化。 hash和history模式区别 特性Hash 模式History 模…...

【xrframe】优化ar相机中加载模型效果

方法一&#xff1a;定义渲染width和height //组件生命周期&#xff1a;在视图层布局完成后执行ready() {const info wx.getSystemInfoSync();//在小程序中同步获取系统信息const width info.windowWidth;//获取屏幕的宽度&#xff08;单位为物理像素&#xff09;const heigh…...

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…...

谷歌插件V3知识点

1.background.js与content.js与popup.js对比: background.js 生命周期:一开始就执行&#xff0c;最早执行且一直执行&#xff1b; 作用&#xff1a;放置全局的、需要一直运行的代码&#xff0c;权限非常高几乎调用所有Chrome api,还可以发起跨域请求&#xff1b; content.js 生…...

webrtc windows 编译,以及peerconnection_client

webrtc windows环境编译&#xff0c;主要参考webrtc官方文档&#xff0c;自备梯子 depot tools 安装 Install depot_tools 因为我用的是windows&#xff0c;这里下载bundle 的安装包&#xff0c;然后直接解压&#xff0c;最后设置到环境变量PATH。 执行gn等命令不报错&…...

geotrust企业通配符证书2990

随着时代的变化&#xff0c;人们获取信息的方式由报纸、书籍变为手机、电脑&#xff0c;因此很多企事业单位用户开始在互联网中创建网站来进行宣传&#xff0c;吸引客户。为了维护网站安全环境&#xff0c;保护客户数据&#xff0c;企事业单位也开始使用SSL数字证书&#xff0c…...

网络安全科普:保护你的数字生活

# 网络安全科普&#xff1a;保护你的数字生活 ## 引言 在数字化时代&#xff0c;网络安全已成为每个人都必须面对的问题。从个人隐私保护到金融交易安全&#xff0c;网络的安全性直接关系到我们的日常生活。因此&#xff0c;普及网络安全知识&#xff0c;提高公众的网络安全意…...

Java实战:递归查找指定后缀名的文件

在日常的软件开发中&#xff0c;经常需要处理文件操作。假设我们有一个需求&#xff1a;从一个包含大量JSON文件的文件夹中提取出所有的JSON文件以进行进一步处理。本文将介绍如何利用Java编写一个高效的方法来递归查找指定后缀名的文件。 代码实现&#xff1a; import java.i…...

Linux 操作系统网络编程1

目录 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型 1.1.2 网络数据传输过程 2 传输层通信协议 2.1 TCP 2.1.1 TCP的3次握手过程 2.1.2 TCP四次挥手过程 2.2 UDP 3 网络编程的IP地址 4 端口 5 套接字 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型…...

从图形界面到命令行:Win11文件管理效率提升指南,用CMD批量删除旧项目文件夹实战

从图形界面到命令行&#xff1a;Win11文件管理效率提升指南&#xff0c;用CMD批量删除旧项目文件夹实战 在数字时代&#xff0c;文件管理效率直接影响工作流程的顺畅程度。对于开发者、设计师和数据分析师这类经常需要处理大量项目文件的专业人士来说&#xff0c;如何快速清理不…...

实战解析:HAL库下ADC常规与注入模式在电机控制中的协同采样策略

1. HAL库下ADC双模式协同采样的必要性 在电机控制系统中&#xff0c;信号采集就像给医生做体检——既需要定期检查血压体温&#xff08;缓变信号&#xff09;&#xff0c;又要在关键时刻做心电图&#xff08;瞬态信号&#xff09;。常规转换模式相当于体检中的常规项目&#xf…...

解密ASCII图表魔法:ditaa将文本艺术转化为专业图表的技术揭秘

解密ASCII图表魔法&#xff1a;ditaa将文本艺术转化为专业图表的技术揭秘 【免费下载链接】ditaa ditaa is a small command-line utility that can convert diagrams drawn using ascii art (drawings that contain characters that resemble lines like | / - ), into proper…...

iOS种子下载终极指南:iTorrent让你的iPhone变身专业下载中心

iOS种子下载终极指南&#xff1a;iTorrent让你的iPhone变身专业下载中心 【免费下载链接】iTorrent Torrent client for iOS 16 项目地址: https://gitcode.com/gh_mirrors/it/iTorrent 还在为iPhone无法下载种子文件而烦恼吗&#xff1f;iTorrent这款专业的iOS种子客户…...

前端转行网络安全靠谱吗?靠挖漏洞变现可行吗

前言 最近&#xff0c;一个做运维的朋友跟我说他在学渗透测试。他说&#xff0c;公司请别人做渗透测试的费用是 2千/人天&#xff0c;一共2周。2周 2w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听…...

终极LXMusic音源配置指南:三步解决全网音乐播放难题

终极LXMusic音源配置指南&#xff1a;三步解决全网音乐播放难题 【免费下载链接】LXMusic音源 lxmusic&#xff08;洛雪音乐&#xff09;全网最新最全音源 项目地址: https://gitcode.com/guoyue2010/lxmusic- 你是否经常遇到音乐软件资源不全、音质不佳的问题&#xff…...

为什么你的/fast命令总被降级?Midjourney内部队列优先级算法首度曝光(含3个即时生效的Prompt签名技巧)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;快速模式降级现象的本质解构 快速模式降级&#xff08;Fast Mode Degradation&#xff09;并非简单的性能衰减&#xff0c;而是现代异步I/O栈中多层协同机制在资源约束下触发的确定性状态迁移过程。其本质是内…...

ArcGIS 10.2.2许可服务罢工了?别慌,试试这个替换Service.txt和ARCGIS.exe的终极方案

ArcGIS 10.2.2许可服务故障终极修复指南&#xff1a;深入解析文件替换方案 当ArcGIS 10.2.2的许可服务突然罢工&#xff0c;所有常规方法都失效时&#xff0c;那种挫败感只有GIS专业人员才能真正体会。你试过关闭防火墙、调整服务启动类型、甚至重启服务器&#xff0c;但那个令…...

抖音无水印视频下载技术深度解析:双架构设计与性能优化方案

抖音无水印视频下载技术深度解析&#xff1a;双架构设计与性能优化方案 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载&#xff1a;https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 抖音无…...

户外太阳能监控供电方案:如何用CN3791芯片为3.7V锂电池设计稳定充电电路?

户外太阳能监控供电方案&#xff1a;CN3791芯片在3.7V锂电池充电电路中的实战设计 清晨六点&#xff0c;当第一缕阳光洒在郊区的通信基站上&#xff0c;搭载CN3791芯片的太阳能供电系统已经开始为锂电池注入能量——这正是现代户外监控设备赖以生存的"能量心脏"。在无…...