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

合肥企业网站建设专家百度知道首页

合肥企业网站建设专家,百度知道首页,镇江网站外包,邵武建设局网站1. 简述 在C的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继…

1. 简述

        在C++的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继续执行。

2. 基本概念

        std::condition_variable通常与std::mutex一起使用,用于保护共享数据并同步线程。在多线程环境中,多个线程可能同时访问和修改共享数据,这可能导致数据不一致或其他不可预测的行为。std::mutex用于确保在任何时候只有一个线程可以访问共享数据,而std::condition_variable则用于在特定条件下唤醒等待的线程。

3. 条件变量的工作原理

        条件变量允许线程在某些条件不满足时挂起(等待),并在条件变为真时被唤醒。这通常涉及到以下三个步骤:

等待条件

线程在进入临界区后,检查条件是否满足。如果不满足,线程会释放互斥锁并进入等待状态。

通知其他线程

        当条件可能已经变为真的事件发生时,另一个线程会通知等待的线程。

重新检查条件

        被通知的线程重新获取互斥锁,并重新检查条件。如果条件仍然不满足,线程可能会再次等待。

4. 主要函数

        std::condition_variable提供了几个主要的成员函数,用于实现线程间的条件同步:

wait(std::unique_lock<std::mutex>& lock)

        使当前线程进入等待状态,直到另一个线程调用notify_one()或notify_all()。在等待期间,lock参数指定的互斥锁会被自动释放,允许其他线程访问共享数据。当线程被唤醒时,互斥锁会再次被锁定。

wait_for(std::unique_lock<std::mutex>& lock, std::chrono::duration<Rep, Period> rel_time)

        与wait()类似,但允许指定一个超时时间。如果超时时间到达而条件仍未成立,线程将停止等待并继续执行。

wait_until(std::unique_lock<std::mutex>& lock, std::chrono::time_point<Clock, Duration> abs_time)

        与wait_for()类似,但允许指定一个绝对时间作为超时时间。

notify_one()

        唤醒等待在condition_variable上的一个线程(如果有的话)。

notify_all()

        唤醒等待在condition_variable上的所有线程。

        std::condition_variable 的 wait、notify_one 和 notify_all 函数都要求在调用时拥有互斥锁的所有权。std::unique_lock 通过提供对互斥锁的独占控制,确保了这些条件变量函数能够安全地与锁的获取和释放配合工作。

使用 std::unique_lock 包装 std::mutex 是为了确保线程安全、简化资源管理、防止死锁,并与条件变量正确配合。

5. 例程

        在这个程序里,我们的条件就是ready变量变为true,然后再执行其他操作。

#include <iostream>  #include <thread>  #include <mutex>  #include <condition_variable>  std::mutex mtx;  std::condition_variable cv;  bool ready = false;  void print_id(int id) {  std::unique_lock<std::mutex> lck(mtx);  /** 如果条件不满足,则等待. */while (!ready) {cv.wait(lck); ///< 等待、阻塞}/** 执行其他操作. */}  void Signal() {  std::unique_lock<std::mutex> lck(mtx);  ready = true;  ///< 设置条件为true  cv.notify_all();  ///< 唤醒所有等待的线程  }  int main(int argc, char* argv[]){std::thread threads[10];  /** 发起10个线程. */  for (int i = 0; i < 10; ++i)  threads[i] = std::thread(print_id, i);  std::cout << "10 threads ready to race...\n";  Signal(); ///< 唤醒线程,继续执行.for (auto& th : threads){th.join();}return 0;  }

http://www.yayakq.cn/news/717850/

相关文章:

  • 网站漂浮广告怎么做网站开发工程师英文简历
  • 阜新市网站建设建设银行个人网上银行网站加载
  • 苏州做网站最好公司赣州酒店网站设计
  • 莆田系医院的网站用什么做的一对一软件
  • 网络营销 企业网站海外贸易在什么网站做
  • 关于网站建设的网站有哪些天河区网站公司
  • 中国企业网站建设外包服务市场手机网站开发session
  • 宜昌网站建设哪个公司好房地产网站做百度推广
  • 做网站如何把支付宝微信吧网站建设中 显示 虚拟机
  • 东平网站制作哪家好wordpress如何生成html
  • 做网站工具 不懂代码无锡网页建站
  • 摄影师网站模板成都自动seo
  • 食品网站制作建设企业网站的需求
  • 做阿里巴巴怎么进公司网站网站首页下拉广告
  • 宝安营销型网站制作网站建设的目录浏览
  • 权威的郑州网站建设外贸网站源码 php
  • 做封面的软件ps下载网站深圳代理记账公司电话
  • 网页设计网站结构图怎么弄秦皇岛优化网站排名
  • 企业网站推广方案网络营销作业wordpress仿卢松松
  • 学校门户网站模板python入门教程完整版
  • 南宁网站建设 超薄网络html个人网页设计代码
  • 商城购物网站建设方案服装网站公司网站
  • 关键词查询网站电脑网页怎么截图
  • 沭阳找做网站合伙中细软网站建设
  • 现在还用dw做网站设计么团购网站建站
  • 重庆云阳网站建设报价网站打开是目录结构图
  • 庆阳网站建设报价河南建设工程教育网
  • 做网站一屏有多大不知此网站枉做男人的网站
  • 网站开发教材绿植网站怎么做
  • 站长之家素材网如何注册免费网站域名