两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)
C++自学精简教程 目录(必读)
C++并发编程入门 目录
多线程同步
线程之间同步是指线程等待其他线程执行完某个动作之后再执行(本文情况)。
线程同步还可以是像十字路口的红绿灯一样,只允许一个方向的车同行,其他方向的车等待。
本文将使用信号量来实现线程同步。
一个线程通知另一个线程,另一个线程等待被通知信号。
一个发送线程先往控制台上打印1,这时候接收线程并不往控制台打印2,而是等待发送线程发给自己的信号,等到信号之后再打印2.
每次发送线程打印完自己的数据之后,睡眠1毫秒,给接收线程时间来完成自己的工作。
睡眠1毫秒合理吗?
这里睡眠1毫秒是合理的。
多个线程在协调工作的时候,每个线程都会需要时间来才能解决问题。
所以作为协调源头的线程1,应该给其他线程时间来处理问题,这是合理的。
例如,在音视频开发中,采集是源头,比如120HZ的视频,时间间隔是8.333ms,所有后续的编码线程,推流线程,等等,都需要在这有限的8.333毫秒之内完成自己的工作。
STL 写法
// condition_variable::notify_one
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#include <chrono> //milliseconds
using namespace std;
using namespace chrono;std::mutex mutex1;
std::condition_variable event;void thread_sender_fun(void)
{while (true){cout << "1";event.notify_one();this_thread::sleep_for(milliseconds(1));}
}void thread_receiver_fun()
{while (true){std::unique_lock<std::mutex> lock(mutex1);event.wait(lock);cout << "2";}
}int main()
{std::thread thread_sender(thread_sender_fun);std::thread thread_receiver(thread_receiver_fun);// join them back:thread_sender.join();thread_receiver.join();return 0;
}

Windows 写法
#include <windows.h>
#include <iostream>
using namespace std;HANDLE event;//事件对象DWORD WINAPI sender_event_thread_fun(LPVOID lpParam)
{while (true){cout << "1";//干活SetEvent(event);//发出写完成信号,通知另一个线程该打印2了Sleep(1);}return 0;
}DWORD WINAPI receive_event_thread_fun(LPVOID lpParam)
{UNREFERENCED_PARAMETER(lpParam);while (true){DWORD dwWaitResult = WaitForSingleObject(event, INFINITE);// 等待信号,无限等待cout << "2";//干活}return 0;
}int main(void)
{event = CreateEvent(NULL,//是否需要人工ResetEvent重置为无信号状态://是:当该事件为有信号状态时,所有等待该信号的线程都变为可调度线程。// 并且,需要手动调用ResetEvent为无信号状态;//否:当该事件为有信号状态时,只有一个线程变为可调度线程。// 并且,系统自动调用ResetEvent将该对象设置为无信号状态。(一次性的信号)FALSE,FALSE,//初始状态:无信号状态TEXT("WriteFinishedEvent")// 事件对象名称);//创建线程HANDLE thread_sender = CreateThread(NULL, 0, sender_event_thread_fun, NULL, 0, NULL);HANDLE thread_receive = CreateThread(NULL, 0, receive_event_thread_fun, NULL, 0, NULL);HANDLE handleArr[] = { thread_sender , thread_receive };//等待线程执行结束WaitForMultipleObjects(2, handleArr, TRUE, INFINITE);//释放资源CloseHandle(thread_sender);CloseHandle(thread_receive);CloseHandle(event);return 0;
}
Linux 写法
#include <pthread.h>
#include <semaphore.h>
#include <iostream>
#include <unistd.h>//usleep
using namespace std;sem_t event;void* thread_sender_fun(void* arg)
{while (true){cout << "1";sem_post(&event);usleep(1000);//休眠一毫秒}return 0;
}void* thread_receive_fun(void* arg)
{while (true){sem_wait(&event);cout << "2";}return 0;
}int main(int argc, char *argv[])
{pthread_t thread_sender;pthread_t thread_receiver;sem_init(&event, 0, 0);pthread_create(&thread_sender, NULL, thread_sender_fun, NULL);pthread_create(&thread_receiver, NULL, thread_receive_fun, NULL);pthread_join(thread_sender, NULL);pthread_join(thread_receiver, NULL);return 0;
}
相关文章:
两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)
C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行(本文情况)。 线程同步还可以是像十字路口的红绿灯一样,只允许一个方向的车同行,其他方向的车等待。 本…...
Ubuntu18.04更改镜像源(网易,阿里,清华,中科大,浙大)
一,备份原来的源(选做) sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 二,更换源 sudo gedit /etc/apt/sources.list 删除原来内容改为新的镜像源 1,清华源 deb https://mirrors.tuna.tsinghua.edu…...
字节码和机器码的区别
字节码和机器码是计算机程序在不同阶段的表示形式,它们的主要区别如下: 抽象级别不同:字节码是一种中间表示形式,位于源代码和机器码之间。它是一种与特定平台无关的低级表示形式,通常由编译器将源代码转换而来。而机器…...
go学习part21 Redis和Go(2)
1.三方库安装 309_尚硅谷_Go连接到Redis_哔哩哔哩_bilibili 借鉴: Golang 安装 Redis_go fiber 安装redis_柒柒伍贰玖。的博客-CSDN博客 三方redis库已经迁移到以下网址,go get github.com/gomodule/redigo/redis gomodule/redigo: Go client for Red…...
从0到1学会Git(第二部分):Git的本地操作和管理
写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域,分别为工作区,暂存区和本地仓库,我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为,cpu中,…...
hive lateral view 实践记录(Array和Map数据类型)
目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据: create table tmp.test_lateral_view_movie_230829(movie string,category array&…...
理解 std::thread::join
C多线程并发编程入门(目录) 本文用最简单易懂的实际案例,讲清楚了 join 的实际内涵,保证你过目不忘。 Hello join 示例 join 函数是我们接触C多线程 thread 遇到的第一个函数。 比如: int main() {thread t(f);t.…...
C#循环定时上传数据,失败重传解决方案,数据库标识
有些时候我们需要定时的上传一些数据库的数据,在数据不完整的情况下可能上传失败,上传失败后我们需要定时在重新上传失败的数据,该怎么合理的制定解决方案呢?下面一起看一下: 当然本篇文章只是提供一个思路࿰…...
R语言图形的组合( par(),layout(),par(fig()) )
引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据,需要可自取 链接:https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…...
如何为 Flutter 应用程序创建环境变量
我们为什么需要环境变量? 主要用于存储高级机密数据,如果泄露可能会危及您产品的安全性。这些变量本地存储在每个用户的本地系统中,不应该签入存储库。每个用户都有这些变量的副本。 配置 在根项目中创建一个名为 .env 的文件夹(…...
「C++程序设计 (面向对象进阶)」学习笔记・一
0、引言 本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ 😀 有关于现代 C 的基本介绍,请前往《现代C基本介绍》! 🔔 先决条件 本专栏的系列…...
Leetcode125. 验证回文串
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…...
【Yellowbrick】特征可视化分析
Yellowbrick特征可视化分析 ⭐Yellowbrick⭐特征分析可视化⭐Rank1D⭐Rank2D ⭐Yellowbrick Yellowbrick是一个用于可视化机器学习模型和评估性能的Python库。它提供了一系列高级可视化工具,帮助数据科学家和机器学习从业者更好地理解、调试和优化他们的模型。 它在…...
Android大厂需要刷的(999道)面试题
想必大家都在为今年的金九银十做准备,今年也是最为艰难的一年。作为程序员从未感觉到如此艰难,身边不是被辞退就是找不到工作。先不说2023年应届生毕业即失业,作为开发15年的老Android程序员,现在也在和300个人挣一个岗位。 肉少…...
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…...
Java设计模式:四、行为型模式-08:策略模式
文章目录 一、定义:策略模式二、模拟场景:策略模式三、违背方案:策略模式3.0 引入依赖3.1 工程结构3.2 优惠券折扣计算类3.3 单元测试 四、改善代码:策略模式4.1 工程结构4.2 策略模式结构图4.3 优惠券折扣实现4.3.1 定义优惠券接…...
ICCOA蓝牙数字车钥匙2.0
近期,ICCOA智慧车联开放联盟宣布,由小米、vivo、OPPO、长安、深蓝、吉利、极氪、比亚迪、北汽、蔚来、零跑、雪球、瓶钵、融卡等企业联合参与制定的ICCOA蓝牙数字车钥匙2.0标准(简称DK2.0),于2023年9月1日正式发布实施…...
ArcGIS土地利用程度综合指数分析
成图展示: 土地利用程度综合指数 第一步 准备数据 使用的数据为2010年河南省土地利用类型数据与其行政区划县级数据(为了节省操作,这里使用上次实验的部分数据[1],各土地利用类型已被提取) 第二步 面积统计 水域为例…...
服务端请求伪造(SSRF)及漏洞复现
文章目录 渗透测试漏洞原理服务端请求伪造1. SSRF 概述1.1 SSRF 场景1.1.1 PHP 实现 1.2 SSRF 原理1.3 SSRF 危害 2. SSRF 攻防2.1 SSRF 利用2.1.1 文件访问2.1.2 端口扫描2.1.3 读取本地文件2.1.4 内网应用指纹识别2.1.5 攻击内网Web应用 2.2 SSRF 经典案例2.2.1 访问页面2.2.…...
v-model和v-bind
v-model,它其实就是一个语法糖,作用就是双向绑定表单控件(radio, text,address,email,select,checkbox,textarea) v-bind(简写形式:value值),用于绑定属性值,只能实现数据的单项绑定。 <template> <div>…...
【CTF】【Misc 文件类型】工具与流程
工具准备 本人为方便 CTF 部分 Misc 类型的解题,制作如下集成软件。本软件集成常用功能,能一站式解决大多数 Misc 文件类问题,省去切换工具的繁琐流程,大大提高解题效率,且界面简洁易用。且预留了拓展接口,…...
Kubernetes原生部署Jenkins:全栈方案与生产级实践指南
1. 项目概述:一个为Kubernetes而生的Jenkins全栈部署方案在容器化和云原生技术席卷全球的今天,Jenkins作为持续集成与持续交付领域的常青树,其部署形态也正经历着深刻的变革。直接将Jenkins部署在物理机或虚拟机上,虽然简单直接&a…...
计算机 AI 方向 SCI 推荐|AI / 计算机 SCI 清单:3本 2区 + 1本 3区保底,无预警、对国人极度友好,易中稿,录用率拉满好投稿,硕博 / 青年教师首选,AI 科研人必藏!
投稿实用建议(CSDN科研人专属)优先选刊:追求高影响力、评职首选「Applied Soft Computing」;追求高录用率、快速毕业首选「Neurocomputing」。避坑提醒:所有期刊均为非预警刊,自引率均在安全范围࿰…...
MobaXterm实战:一站式打通串口调试与远程SSH管理
1. 为什么选择MobaXterm作为全能终端工具 第一次接触嵌入式开发时,我被各种终端工具搞得晕头转向——串口调试要用SecureCRT,SSH连接得开PuTTY,文件传输还得额外装WinSCP。直到同事推荐了MobaXterm,这个法国开发者打造的免费工具彻…...
终极指南:如何用FFXIV TexTools模组管理器轻松定制最终幻想14外观
终极指南:如何用FFXIV TexTools模组管理器轻松定制最终幻想14外观 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI FFXIV TexTools模组管理器是《最终幻想14》玩家社区中最强大的外观定制工具ÿ…...
Claude Code Ultraplan 远程多代理规划全解析:AI Agent、CCR远程容器、异步规划、状态机、计划传送与企业级自动化治理
一、先说结论:Ultraplan 到底解决了什么痛点?Ultraplan 可以理解为一种“远程规划模式”:用户在本地终端发起一个复杂任务,系统把规划阶段卸载到远程 CCR 容器中执行。本地终端不再被长时间占住,远程端可以使用更强模型…...
基于开源项目构建智能音箱自定义电台技能:从原理到部署实践
1. 项目概述:一个为智能音箱打造的“龙虾电台”技能最近在折腾智能家居和语音助手,发现一个挺有意思的开源项目,叫“lobster-radio-skill”。光看名字,你可能会有点摸不着头脑:“龙虾电台”?这跟智能音箱有…...
为什么MIT化学系要求博士生必学NotebookLM?——解密其在NMR谱图关联推理与副产物预测中的3个未公开API调用逻辑
更多请点击: https://intelliparadigm.com 第一章:NotebookLM化学研究辅助 NotebookLM 是 Google 推出的基于 AI 的研究协作者,专为深度阅读、知识整合与推理设计。在化学研究场景中,它能高效解析 PDF 格式的文献(如 …...
告别繁琐:Windows平台I2C总线高效调试实战
1. Windows平台I2C调试痛点解析 第一次在Windows下调试I2C设备时,我对着示波器抓到的杂乱波形发呆了整整两小时。与Linux系统自带i2c-tools的便利性相比,Windows环境确实像个"二等公民"——直到我发现CH341A这个神器。这个售价不到20元的USB转…...
共享茶室智能系统与运营全解析:从空间设计到自动化管理
1. 项目概述:为什么“共享茶室”正在重塑传统茶饮消费如果你最近留意过城市里的新业态,可能会发现一种名为“共享茶室”的空间正在悄然兴起。它不像传统的茶馆那样需要高昂的消费和复杂的社交礼仪,也不像奶茶店那样主打快节奏的“即买即走”。…...
