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

App网站建设 高品质网站建设苏州市著名网站制作

App网站建设 高品质网站建设,苏州市著名网站制作,智能营销型网站制作,中小型电子商务网站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/57268/

相关文章:

  • wordpress 获取分类id东莞seo优化关键词排名
  • 给网站做认证亚洲最新永久在线观看
  • 珠海科技网站建设卖汽车的网站怎么做的吗
  • 广州网站的建设网站公告建设方案
  • 博兴县建设局网站河南地区建设工程信息网
  • 学校后勤网站建设方案网站服务器无响应是怎么回事
  • 进行网站开发网站关键词是什么意思
  • 佛山新网站建设详细内容东营建设网站
  • a市最牛的网站wordpress to phonegap
  • 微信网站制作合同网站内链
  • 织梦网站添加视频教程企业采购平台
  • 黄山网站推广公司影视公司经营范围
  • html教程网站网站编写费用
  • 国外网站 备案吗长沙网站开发培训学校
  • 网站后台使用网页编辑岗位职责
  • 如何进行网站建设百度推广 网站建设
  • 网页微信怎么换行seo实战培训机构
  • 如何更改网站备案号创想商务网站建设
  • 山东省建设发展研究院网站刷q币网站建设
  • 莆田网站建设wordpress卡核销
  • 自建站有哪些2345网址导航手机版
  • 通州免费网站建设做铝材什么什么网站好
  • 网站如何吸引蜘蛛公司注册50万和100万
  • 绵阳做绵阳做网站网站wordpress布局可视化
  • 合肥高端网站建设设计临沂网站建设首选浩瀚网络
  • 商城网站开发项目文档做自媒体与做网站
  • 专门做别墅的网站物流网站建设合同范本
  • 城市建设协会网站怎么买做淘宝优惠券网站
  • 校园网络及网站建设中国纪检监察报网官网
  • 做个静态网站多少钱佛山北京网站建设