IT评测·应用市场-qidao123.com技术社区

标题: 多线程编程:线程间的同步与通讯 [打印本页]

作者: 伤心客    时间: 2024-12-5 15:49
标题: 多线程编程:线程间的同步与通讯
多线程编程:线程间的同步与通讯


一、概述

在多线程编程中,必须解决以下两个核心问题:

二、线程间的互斥

1. 静态条件与临界区


2. 互斥锁(Mutex)



三、线程间的同步通讯

1. 同步通讯的必要性


2. 条件变量(Condition Variable)



四、生产者-消费者模子

1. 问题描述

生产者线程负责生产数据,并将数据放入队列;消费者线程负责从队列中取出数据并消费。


2. 代码实现

全局变量

  1. std::queue<int> q;                  // 共享队列
  2. std::mutex mtx;                     // 互斥锁
  3. std::condition_variable cv;         // 条件变量
复制代码
生产者函数

  1. void producer() {
  2.     for (int i = 1; i <= 10; ++i) {
  3.         std::unique_lock<std::mutex> lock(mtx); // 加锁
  4.         q.push(i);                              // 生产数据
  5.         std::cout << "Produced: " << i << std::endl;
  6.         cv.notify_all();                        // 通知消费者
  7.         std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间
  8.     }
  9. }
复制代码
消费者函数

  1. void consumer() {
  2.     for (int i = 1; i <= 10; ++i) {
  3.         std::unique_lock<std::mutex> lock(mtx);               // 加锁
  4.         cv.wait(lock, [] { return !q.empty(); });             // 等待队列非空
  5.         int value = q.front();                                // 获取数据
  6.         q.pop();                                              // 移除数据
  7.         std::cout << "Consumed: " << value << std::endl;      // 打印消费日志
  8.         lock.unlock();                                        // 解锁
  9.         cv.notify_all();                                      // 通知生产者
  10.         std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟消费时间
  11.     }
  12. }
复制代码
主函数

  1. int main() {
  2.     std::thread t1(producer); // 创建生产者线程
  3.     std::thread t2(consumer); // 创建消费者线程
  4.     t1.join();                // 等待生产者线程完成
  5.     t2.join();                // 等待消费者线程完成
  6.     return 0;
  7. }
复制代码

3. 核心逻辑

同步通讯的实现


4. 状态厘革分析

变乱状态举动消费者发现队列为空阻塞等候生产者生产数据后被关照生产者生产数据队列非空,关照消费者消费者从等候状态转为阻塞状态,等候获取锁继续执行消费者消费数据队列可能为空,关照生产者生产者从等候状态转为阻塞状态,等候获取锁继续执行
6. 注意事项


五、总结


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4