c++激活指定的线程交叉对比试验

1.概要

c++激活指定的线程交叉对比试验

  • 两个线程等待,两个线程都激活
  • 两个线程等待,第二个线程先激活
  • 两个线程等待,第一个线程先激活

2.代码

#include <iostream>  
#include <thread>  
#include <mutex>  
#include <condition_variable>  
#include <atomic>  namespace test1 {std::mutex mtx;std::condition_variable cv;std::atomic_bool ready(false);std::mutex mtx2;std::condition_variable cv2;std::atomic_bool ready2(false);void worker_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []() { return ready.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.----------1\n";}void worker_thread2() {std::unique_lock<std::mutex> lock(mtx2);cv2.wait(lock, []() { return ready2.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.---------2\n";}void main() {std::thread t(worker_thread);std::thread t2(worker_thread2);// 模拟一些工作,然后唤醒线程  std::this_thread::sleep_for(std::chrono::seconds(2));{std::lock_guard<std::mutex> lock(mtx);ready.store(true); // 设置ready为true,这可能会唤醒等待的线程  std::lock_guard<std::mutex> lock2(mtx2);ready2.store(true); // 设置ready为true,这可能会唤醒等待的线程 }cv.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  cv2.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  t.join();t2.join();}
}
//单独唤醒线程2
namespace test2 {std::mutex mtx;std::condition_variable cv;std::atomic_bool ready(false);std::mutex mtx2;std::condition_variable cv2;std::atomic_bool ready2(false);void worker_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []() { return ready.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.----------1\n";}void worker_thread2() {std::unique_lock<std::mutex> lock(mtx2);cv2.wait(lock, []() { return ready2.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.---------2\n";std::cout << "WWait 2 minutes before waking up thread -------1\n";std::this_thread::sleep_for(std::chrono::seconds(2));cv.notify_one();}void main() {std::cout << "Wake thread 2 alone\n";std::thread t(worker_thread);std::thread t2(worker_thread2);// 模拟一些工作,然后唤醒线程  std::this_thread::sleep_for(std::chrono::seconds(2));{std::lock_guard<std::mutex> lock(mtx);ready.store(true); // 设置ready为true,这可能会唤醒等待的线程  std::lock_guard<std::mutex> lock2(mtx2);ready2.store(true); // 设置ready为true,这可能会唤醒等待的线程 }//cv.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  cv2.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  t.join();t2.join();}
}
//单独唤醒线程1
namespace test3 {std::mutex mtx;std::condition_variable cv;std::atomic_bool ready(false);std::mutex mtx2;std::condition_variable cv2;std::atomic_bool ready2(false);void worker_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []() { return ready.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.----------1\n";std::cout << "WWait 2 minutes before waking up thread --------2\n";std::this_thread::sleep_for(std::chrono::seconds(2));cv2.notify_one();}void worker_thread2() {std::unique_lock<std::mutex> lock(mtx2);cv2.wait(lock, []() { return ready2.load(); }); // 等待直到ready为true  // 线程被唤醒后,继续执行后续操作  std::cout << "Worker thread is awaken and continuing execution.---------2\n";}void main() {std::cout << "Wake thread 1 alone\n";std::thread t(worker_thread);std::thread t2(worker_thread2);// 模拟一些工作,然后唤醒线程  std::this_thread::sleep_for(std::chrono::seconds(2));{std::lock_guard<std::mutex> lock(mtx);ready.store(true); // 设置ready为true,这可能会唤醒等待的线程  std::lock_guard<std::mutex> lock2(mtx2);ready2.store(true); // 设置ready为true,这可能会唤醒等待的线程 }cv.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  //cv2.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)  t.join();t2.join();}
}int main() {test1::main();test2::main();test3::main();return 0;
}

3.运行结果

Worker thread is awaken and continuing execution.----------1
Worker thread is awaken and continuing execution.---------2
Wake thread 2 alone
Worker thread is awaken and continuing execution.---------2
WWait 2 minutes before waking up thread -------1
Worker thread is awaken and continuing execution.----------1
Wake thread 1 alone
Worker thread is awaken and continuing execution.----------1
WWait 2 minutes before waking up thread --------2
Worker thread is awaken and continuing execution.---------2

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

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

相关文章

【Java EE】多线程(三)线程状态

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

Spring AOP(3)

目录 Spring AOP原理 代理模式 代理模式中的主要角色 静态代理 动态代理 总结:面试题 什么是AOP? Spring AOP实现的方式有哪些? Spring AOP实现原理 Spring使用的是哪种代理方式? JDK和CGLIB动态代理的区别? Spring AOP原理 代理模式 代理模式, 也叫委托模式. …

JavaScript 流程控制语句详解:if语句、switch语句、while循环、for循环等

JavaScript&#xff0c;作为一种广泛使用的编程语言&#xff0c;它的流程控制语句是构建逻辑和实现功能的基础。流程控制语句包括条件语句、循环语句和转向语句&#xff0c;它们是编程中不可或缺的部分。 接下来&#xff0c;我们将一一解析这些语句&#xff0c;带你走进JavaSc…

刷代码随想录有感(58):二叉树的最近公共祖先

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root NULL)return NULL;if(root p || root q)return root;TreeNode* left traversal(root->left, p, q);TreeNode* right traversal(r…

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内&#xff0c;价值超过 50 万亿美元的重工业市场&#xff0c;正在竞相实现数字化。 基于此&#xff0c;为帮助数字孪生技术更好地赋能千行百业&#xff0c;AI 企业 NVIDIA 在架构底层算力的同时&#xff0c;也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …

【中级软件设计师】上午题14-信息安全

上午题14-信息安全 1 防火墙1.1 包过滤防火墙1.2 应用代理网关防火墙1.3 状态检测技术防火墙 2 病毒3 网络攻击4 网络安全 1 防火墙 防火墙作为网络安全体系的基础和核心控制设施&#xff0c;贯穿于受控网络通信主干线&#xff0c;对通过受控干线的任何通信行为进行安全处理&a…

【UGUI】实现长按播放动画松手停止动画播放

场景部分&#xff0c;需要把角色和动画组件、动画控制器、动画片段准备好 然后设置好转换动画的参数RUN (bool类型的) 创建一个普通按钮在UGUI里面&#xff0c;为按钮添加组件EventTrgger 在这个组件里面添加PointerDown 和PointerUp 这两个分别代表按下和弹起&#xff01; 他…

【Python小技巧】matplotlib不显示图像竟是numpy惹的祸

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、问题&#xff1a;df.plot() 显示不出图像二、尝试各种解决办法1. 增加matplotlib.use&#xff0c;设定GUI2. 升级matplotlib版本 三、numpy是个重要的库1. …

如何永久删除服务和相关文件夹

如何永久删除服务和文件夹&#xff1f; How can I remove the service and folder permanently? 以AlibabaProtect服务为例 takeown /f "C:\Program Files (x86)\AlibabaProtect sc delete AlibabaProtect我运行了上述操作&#xff0c;并通过任务管理器杀死了“阿里巴巴…

HTML5+CSS3+JS小实例:旋转渐变光标

实例:旋转渐变光标 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

python学习笔记-01

python 在学习之前要了解的事项&#xff1a; 1.python缩进语法要求较为严格 2.是解释型语言 3.python2版本和python3版本不兼容 本系列笔记全部基于python3 1.hello world 安装好python之后&#xff0c;可以直接打开python&#xff0c;也可以通过cmd进入python。 print(&qu…

HSM 中文应用笔记

AP32349 HSM 启动 AP32373 适用于 TC3xx 的 HSM 演示示例 AP32391 使用 HSM 安全启动 AP32399 TC3xx 调试保护&#xff08;带HSM&#xff09; AP32404 教程 TC3xx 使用 SWAP 机制进行无线软件更新 AP32456 TC3xx HSM 缓存使用教程 AP32470 HSM 演示优化代码 AP32481 教程调试器…

LineVul实验复现及相关问题

最近在复现 LineVul 这篇文章的实验&#xff0c;本文主要用于简化文章复现流程和记录复现过程中出现的问题。 1 安装依赖环境 pip install gdown pip install transformers pip install captum pip install torch torchvision torchaudio pip install numpy pip install tqdm…

实用工具radsystems,十分钟完成项目的登入注册,增删改查

发了这么多文章&#xff0c;很多人不知道这些文章是在讲什么&#xff0c;今天我来介绍一下逆天神器radsystems radsystems是一个可以快速开发的软件&#xff0c;也可以二次开发&#xff08;之前文章有讲&#xff09; 它可以帮助我们快速完成开发&#xff0c;毫不夸张的讲&…

PGSync安装使用教程(PostgreSQL数据实时同步至Elasticsearch)

说明 pgsync项目有两个&#xff0c;一个是ankane/pgsync&#xff0c;用于pgsql之间的数据同步&#xff0c;另一个是toluaina/pgsync&#xff0c;用于pgsql的数据同步至es&#xff0c;本教程适用于第二个项目。 pgsync应该是目前为止唯二支持es8的数据同步工具&#xff0c;另一…

探秘Flex布局下子元素宽度超出的那些烦心事

嘿&#xff0c;小伙伴们&#xff01;你们有没有遇到过用Flex布局的时候&#xff0c;子元素的宽度莫名其妙地超出了父元素的情况&#xff1f;别着急&#xff0c;今天我就来给大家揭秘这个问题的来龙去脉&#xff0c;以及一些解决方案。让我们一起来深入探讨&#xff01; 发现问…

Android 蓝牙实战——蓝牙音乐播放进度(二十)

对于蓝牙音乐的开发来说,播放进度是一个比较重要的数据参数,这里我们就来分析一下蓝牙音乐播放进度的相关回调。 一、回调流程 1、AvrcpControllerService 源码位置:/packages/apps/Bluetooth/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java /…

Agent AI智能体的未来探讨

背景 Agent AI智能体&#xff0c;作为人工智能技术的一种重要形态&#xff0c;正逐渐融入我们的日常生活并扮演着越来越重要的角色。随着技术的不断发展和智能化水平的提高&#xff0c;Agent AI在未来社会中的角色、发展路径以及其它方面可能带来的挑战备受广泛关注。本…

代码随想录算法训练营第四十五天| 70. 爬楼梯 (进阶), 322. 零钱兑换,279.完全平方数

目录 题目链接&#xff1a;70. 爬楼梯 &#xff08;进阶&#xff09; 思路 代码 题目链接&#xff1a;322. 零钱兑换 思路 代码 题目链接&#xff1a;279.完全平方数 思路 代码 总结 题目链接&#xff1a;70. 爬楼梯 &#xff08;进阶&#xff09; 思路 依旧是转换成…

package.json.依赖版本修改判断

package.json. 的dependencies已经改了axios版本"axios": “^1.6.8”, 查看dist\cdn\axios\1.0.0\axios.min.js中内容还是&#xff1a;/* axios v0.17.1 | © 2017 by Matt Zabriskie */以为没有更新axios版本 查看当前项目使用的包以及版本&#xff0c;不包括依…