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

c++中的多线程通信

信息传递

#include <iostream>  
#include <thread>  
#include <chrono>  
#include <mutex>  
#include <condition_variable>  
#include <queue>  // 用于存储和同步数据的结构  
struct Data {std::queue<std::string> messages;std::mutex mutex;std::condition_variable condVar;
};// 第一个线程函数  
void thread1(Data& data) {for (int i = 0; i < 10; i++) {std::this_thread::sleep_for(std::chrono::seconds(5));std::lock_guard<std::mutex> lock(data.mutex);data.messages.push("Hello Word!");data.condVar.notify_one(); // 通知第二个线程  }
}// 第二个线程函数  
void thread2(Data& data) {while (true) {std::unique_lock<std::mutex> lock(data.mutex);data.condVar.wait(lock, [&]() { return !data.messages.empty(); }); // 等待第一个线程的通知  std::string message = data.messages.front();data.messages.pop();lock.unlock();std::cout << "Received: " << message << std::endl;}
}int main() {Data data;std::thread t1(thread1, std::ref(data));std::thread t2(thread2, std::ref(data));t1.join();t2.detach(); // 我们希望第二个线程继续运行,所以分离它  return 0;
}

事件管理

#include <iostream>  
#include <thread>  
#include <mutex>  
#include <condition_variable>  
#include <queue>  class EventManager {
public:EventManager() {}void publish(int data) {std::unique_lock<std::mutex> lock(m_mutex);m_dataQueue.push(data);m_cond.notify_all();}int subscribe() {std::unique_lock<std::mutex> lock(m_mutex);while (m_dataQueue.empty()) {m_cond.wait(lock);}int data = m_dataQueue.front();m_dataQueue.pop();return data;}private:std::mutex m_mutex;std::condition_variable m_cond;std::queue<int> m_dataQueue;
};void threadFunction1(EventManager& eventManager) {for (int i = 1; i <= 10; ++i) {eventManager.publish(i);std::cout << "Thread 1 published data: " << i << std::endl;}
}void threadFunction2(EventManager& eventManager) {for (int i = 1; i <= 10; ++i) {int data = eventManager.subscribe();std::cout << "Thread 2 subscribed data: " << data << std::endl;}
}int main() {EventManager eventManager;std::thread thread1(threadFunction1, std::ref(eventManager));std::thread thread2(threadFunction2, std::ref(eventManager));thread1.join();thread2.join();return 0;
}
http://www.lryc.cn/news/165703.html

相关文章:

  • IO day7
  • C语言之指针进阶篇(3)
  • SQL7 查找年龄大于24岁的用户信息
  • vite搭建vue3项目
  • Qt中表格属性相关操作,调整表格宽度高度自适应内容等
  • NLP机器翻译全景:从基本原理到技术实战全解析
  • docker四种网络模式
  • C 风格文件输入/输出---无格式输入/输出---(std::fgetc,std::getc,std::fgets)
  • 多线程之间如何进行通信 ?
  • 二叉树顺序存储结构
  • Apache HTTPD 多后缀解析漏洞复现
  • 【深入浅出C#】章节10: 最佳实践和性能优化:内存管理和资源释放
  • 我的创作纪念日——1个普通网安人的漫谈
  • Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory
  • 期权交易策略主要有哪些?期权交易策略指南
  • 算法通关村第十四关——解析堆在数组中找第K大的元素的应用
  • 【报错】springboot3启动报错
  • 阿里云服务器配置怎么选择?小白攻略
  • 关于 RK3568的linux系统killed用户应用进程(用户现象为崩溃) 的解决方法
  • EasyPHP-Devserver-17安装和配置mantisBT
  • Python打包教程 PyInstaller和cx_Freeze
  • 用两成数据也能训练出十成功力的模型,Jina Embeddings 这么做
  • SpringCloud Eureka搭建会员中心服务提供方-集群
  • 详解TCP/IP协议第二篇:OSI参考模型详解
  • OpenGL 函数列表
  • 【C语言】每日一题(半月斩)——day1
  • Spring MVC 七 - Locale 本地化
  • 力扣(LeetCode)算法_C++——替换后的最长重复字符
  • unity 编辑器时读取FairyGUI图集单个图像
  • 下载配置 maven并在 idea 上应用