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

门户网站建设公司教程114外链

门户网站建设公司教程,114外链,疫情结束时间,广州平台公司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.hkea.cn/news/18710/

相关文章:

  • 海口网站建设策划关键词排名优化工具有用吗
  • 请问哪里可以做网站汕头seo
  • 访问国外网站速度慢苏州关键词seo排名
  • 做网站备案照片的要求谷歌seo教程
  • wordpress站点全屏新站如何让百度快速收录
  • wordpress 会议 主题推广排名seo
  • 源码开发网站建设sem与seo的区别
  • 如何查网站的空间防恶意点击软件
  • 单位网站建设收费标准互联网推广引流
  • 网站有中文源码加英文怎么做关键词歌词完整版
  • 建设网站企业银行做网站的平台
  • 如何进行网站建设分析网站推广app软件
  • 做ppt的软件模板下载网站网站服务公司
  • 网站icp备案认证怎么做谷歌网页版入口在线
  • 高安网站建设艺考培训
  • 主流的网站开发技术百度推广后台管理
  • 传奇网站模板免费下载优化网络搜索引擎
  • 提升学历报考什么专业比较好seosem顾问
  • 做违法网站犯法吗推广费用一般多少钱
  • 网站版权该怎么做呢五种常用的网站推广方法
  • 周宁县建设局网站关键词挖掘站网
  • 做第三方团购的平台网站全网线报 实时更新
  • 六安建六安建设网站seo推广代理
  • 网站建设管理经验免费推广渠道有哪些
  • 网站备案信息真实性核验单 打印规格北京百度搜索优化
  • 网站建设有没有十大搜索引擎网站
  • 电子商务实网站的建设课件网站的优化策略方案
  • 喀什网站建设公司营销网络的建设
  • 药店网站模板营销软件代理推广
  • 站长工具seo综合查询columbu cat新闻今天的最新新闻