线程间通信和进程间通信

线程间通信

#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <chrono>// 全局变量
std::queue<int> data_queue;
std::mutex mtx;
std::condition_variable cv_data; // 当队列有数据时,通知消费者
std::condition_variable cv_stop; // 当生产者停止时,通知消费者
bool stop = false;std::thread::id getCurrentThreadId() {return std::this_thread::get_id();
}// 生产者线程
void producer() {for (int i = 0; i < 10; ++i) {std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟耗时操作std::lock_guard<std::mutex> lock(mtx);data_queue.push(i);std::cout << "threadid:"<< getCurrentThreadId() << " Produced: " << i << std::endl;cv_data.notify_one(); // 通知消费者有新数据}// 通知消费者停止{std::lock_guard<std::mutex> lock(mtx);stop = true;}cv_stop.notify_one();
}// 消费者线程
void consumer() {while (true) {std::unique_lock<std::mutex> lock(mtx);// 等待数据或停止信号cv_data.wait(lock, []{ return !data_queue.empty() || stop; });if (stop && data_queue.empty()) {// 收到停止信号且队列为空,则退出break;}int value = data_queue.front();data_queue.pop();lock.unlock(); // 解锁以允许其他线程访问队列std::cout<< "threadid:"<< getCurrentThreadId() << " Consumed: " << value << std::endl;// 模拟处理数据的时间std::this_thread::sleep_for(std::chrono::milliseconds(200));}
}int main() {std::thread producer_thread(producer);std::thread consumer_thread(consumer);producer_thread.join();consumer_thread.join();std::cout << "All tasks completed." << std::endl;return 0;
}

进程间通信

使用POSIX命名管道(也称为FIFO)在Unix/Linux环境下实现进程间通信的简单示例

生产者

#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>// 封装函数,返回当前进程的PID
pid_t get_current_process_id() {return getpid();
}int main() {const char* fifo_name = "/tmp/my_fifo";// 创建FIFO,如果已存在则不创建mkfifo(fifo_name, 0666);// 打开FIFO以写入数据int fd = open(fifo_name, O_WRONLY);if (fd == -1) {perror("open");return 1;}const char* data = "Hello from producer!";ssize_t num_bytes = write(fd, data, strlen(data) + 1); // 包含字符串结束符'\0'if (num_bytes == -1) {perror("write");return 1;}close(fd);std::cout <<"Current process ID:"<< get_current_process_id() << "  Data written to FIFO." << std::endl;return 0;
}

消费者

#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
// 封装函数,返回当前进程的PID
pid_t get_current_process_id() {return getpid();
}int main() {const char* fifo_name = "/tmp/my_fifo";// 打开FIFO以读取数据int fd = open(fifo_name, O_RDONLY);if (fd == -1) {perror("open");return 1;}char buffer[256];ssize_t num_bytes = read(fd, buffer, sizeof(buffer) - 1); // 保留一个位置给'\0'if (num_bytes == -1) {perror("read");return 1;}buffer[num_bytes] = '\0'; // 添加字符串结束符close(fd);std::cout <<"Current process ID:"<< get_current_process_id()<< "  Data read from FIFO: " << buffer << std::endl;return 0;
}

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

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

相关文章

启动小程序F12窗口管理器

如何使用小程序F12任务窗口管理器教学流程 一、引言 小程序的开发者们&#xff0c;是否希望有一款工具能帮助你们更好地管理任务窗口&#xff1f; 二、前置准备 观看视频教程 访问B站视频链接&#xff1a;https://www.bilibili.com/video/BV1aa4y197UU/?spm_id_from333.9…

晶圆厂的PE转客户工程师前景怎么样?

知识星球&#xff08;星球名&#xff1a; 芯片制造与封测技术社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 目前在晶圆厂做PE&#xff0c;倒班oncall压力太大把身体搞坏了&#xff0c;现在有一个design house的CE客户工程师的offer&…

java网络:过滤器修改请求头

目录 一、gateway的全局过滤器 二、web的OncePerRequestFilter以及常见过滤器Filter 三、过滤器排序 一、gateway的全局过滤器 Component Slf4j public class GatewayAuthFilter implements GlobalFilter, Ordered {Overridepublic Mono<Void> filter(ServerWebExchan…

跨境选品师不是神话:普通人也能轻松掌握,开启全球贸易新篇章!

随着互联网技术的飞速发展&#xff0c;跨境电商行业已成为全球经济的新增长点。在这个背景下&#xff0c;一个新兴的职业——跨境选品师&#xff0c;逐渐走进了人们的视野。那么&#xff0c;跨境选品师究竟是做什么的?普通人又该如何成为优秀的跨境选品师呢? 一、跨境选品师的…

ABAQUS应用07-实现拉伸和压缩刚度不同的弹簧建模

文章目录 0、背景描述1、步骤 0、背景描述 到目前为止&#xff0c;本文的内容我还没有具体实践过&#xff0c;但是个人认为后期是会用到的。比如说&#xff0c;对于风电机组地基转动刚度的设置&#xff0c;土体就是一种拉压刚度并不相同的材料。所以现在先记录下来&#xff0c…

Python——字典删除键值的方法

del dict[key] # 删除dict字典里的键值

如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?

在Java中使用Spring Cloud Alibaba Sentinel实现熔断功能的步骤如下&#xff1a; 添加依赖 在项目的pom.xml文件中添加Spring Cloud Alibaba Sentinel的依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud…

Java进阶学习笔记24——Object类

Object类: Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用Object类中提供的一些方法。 所有类都是Object类的子孙类。 API文档&#xff1a; Object类的成员方法&#xff1a; Object类的常见方法&#xff1a; Student类&…

Arthas反编译与重新加载class

一、背景 因为其他研发部门同事给的产品jar包存在一个问题&#xff0c;就是http底层的超时时间默认为60s&#xff0c;但是最近调用外部接口同步数据&#xff0c;这个数据量太大导致超时超过60s&#xff0c;每次同步都不成功。但是客户目前对此情况特别不满意&#xff0c;需要紧…

【路径规划】基于飞蛾搜索算法实现复杂城市地形下无人机避障三维航迹规划

研究背景 复杂城市地形下无人机避障三维航迹规划是无人机技术领域的一个重要研究方向。无人机在城市环境中的广泛应用,如快递配送、城市监测和搜救等任务,对其航迹规划和避障能力提出了挑战。 研究背景包括以下方面: 无人机的快速发展:无人机技术在近年来得到了迅猛发展…

勒索病毒的策略与建议

随着网络技术的快速发展&#xff0c;勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金&#xff0c;给个人和企业带来了巨大的损失。因此&#xff0c;了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

Linux网络编程:HTTPS协议

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

uniapp使用uni.chooseImage选择图片后对其是否符合所需的图片大小和类型进行校验

uni.chooseImage的返回值在H5平台和其他平台的返回值有所差异&#xff0c;具体差异看下图 根据图片可以看出要想判断上传的文件类型是不能直接使用type进行判断的&#xff0c;所以我使用截取字符串的形式来判断&#xff0c;当前上传图片的后缀名是否符合所需要求。 要求&#…

驱动与系统学习网址

DRM&#xff08;Direct Rendering Manager&#xff09;学习简介-CSDN博客 Android Qcom Display学习(零)-CSDN博客 https://blog.csdn.net/hexiaolong2009/category_9705063.htmlhttps://blog.csdn.net/hexiaolong2009/category_9705063.htmlRender Hell —— 史上最通俗易懂…

区间合并-leetcode合并石头的最低成本-XMUOJ元素共鸣:深层次的唤醒

题目 思路 话不多说&#xff0c;直接上代码 附上INT_MAX和INT_MIN 【C】详解 INT_MAX 和 INT_MIN&#xff08;INT_MAX 和 INT_MIN是什么&#xff1f;它们的用途是什么&#xff1f;如何防止溢出&#xff1f;&#xff09;_c int max-CSDN博客 代码 /* leetcode合并石头的最低…

clone方法总结Java

Java中Object类当中有许多方法&#xff0c;如图所示&#xff1a; clone方法就是其中一种&#xff0c;分为浅拷贝&#xff0c;深拷贝举一个例子&#xff1a; 浅拷贝&#xff1a; 在Person类当中右键鼠标然后&#xff0c;选中Generate&#xff1a; 然后重写clone方法 protecte…

电赛之路:历年试题剖析、实战经验分享与代码资源宝典

电赛之路&#xff1a;历年试题剖析、实战经验分享与代码资源宝典 一、电赛历年试题剖析2018年试题回顾&#xff1a;智能小车2019年试题精选&#xff1a;智能家居系统 二、实战经验分享1. 团队协作的艺术2. 时间管理与迭代开发3. 代码与文档规范 三、代码程序资源推荐1. GitHub电…

PTA 6-4 配对问题

许多大学生报名参与大运会志愿者工作。其中运动场引导员需要男女生组队&#xff0c;每组一名男生加一名女生&#xff0c;男生和女生各自排成一队&#xff0c;依次从男队和女队队头各出一人配成小组&#xff0c;若两队初始人数不同&#xff0c;则较长那一队未配对者调到其他志愿…

Vue3学习-Pinia 集中式状态管理工具

安装 Pinia npm i piniaPinia 集中式状态管理工具官网 传送门 引入 Pinia //引入 import { createPinia } from pinia const pinia createPinia() const app createApp(App); app.use(pinia);使用 // store 注册 import { defineStore } from "pinia"; export …