创建项目再进行测试比较麻烦,可以使用这个在线编译器进行验证,快速方便

C++11在线编译器

mutex是互斥锁,互斥量

condition_variable是条件变量

std::mutex m;
void fun(){
std::unique_lock<std::mutex> lck(m);//定义时会自动上锁
}
//离开函数fun作用域后,会自动析构并释放锁,当然也可以手动unlock std::unique_lock<std::mutex> lck2(m, std::defer_lock);// 通过defer_lock来手动上锁
lck2.lock()

下面是一段condition_variable的代码,作一点我的注释

来源:https://cplusplus.com/reference/condition_variable/condition_variable/

注意cv.wait(lck)处,在线程被阻塞和唤醒时,分别会释放锁和重新获取锁,和pthread_cond_wait一致

// condition_variable example
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#define threadnum 14 //自行修改观察结果,线程释放锁必然在go释放锁之后出现,有些线程也会在go释放锁之后才上锁 std::mutex mtx;
std::condition_variable cv;
bool ready = false; void print_id (int id) {
std::unique_lock<std::mutex> lck(mtx);//对mtx自动上锁
std::cout<< "thread " << id<<" 上锁"<<std::endl;//如果对下面阻塞释放锁和获取锁有疑问的,可以将此行注释取消进行分析
while (!ready) cv.wait(lck);//等待全局变量ready信号,线程阻塞在此,放弃cpu,在队列里等待cv的信号来唤醒,自动调用lck.unlock()释放锁
//当被唤醒时,会重新获取锁,自动调用lck.lock()
// ...
std::cout << "thread " << id <<" 释放锁"<<std::endl;
} void go() {
std::unique_lock<std::mutex> lck(mtx);//上锁
ready = true;//全局变量ready置为true
cv.notify_all();//唤醒所有等待线程
//离开该函数作用域,析构lck,并unlock该锁
std::cout<<"go 释放锁"<<std::endl;
} int main ()
{
std::thread threads[threadnum];
for (int i=0; i<threadnum; ++i)
threads[i] = std::thread(print_id,i);//创建时就开始运行,但阻塞在cv处,等待信号 std::cout << "threads ready to race...\n";
go();// go! for (auto& th : threads) th.join(); return 0;
}

最新文章

  1. Jquerymobile随笔
  2. 一个Struts2的实例
  3. 什么是REST、RESTful
  4. 在delphi下TClientSocket的使用技巧 转
  5. 分享一下jQuery UI的地址
  6. 推荐5个应用 jQuery 特效的精美特效
  7. win7 安装Oracle 10G,11G
  8. Spark之路 --- Scala用JFreeChart画图表实例
  9. URAL 1353 Milliard Vasya&#39;s Function(DP)
  10. 深入研究Block捕获外部变量和__block实现原理
  11. C蛮的全栈之路-node篇(二) 实战一:自动发博客
  12. wampserver php 设置时间
  13. java_web学习(3)XML基础
  14. C++ 头文件系列 (algorithm)
  15. Python3解析html高级操作
  16. mysql日期 获取本月第一天 获取下个月的第一天
  17. C#数据同步中基本步骤和用到的相关函数
  18. dubbo源码分析3——SPI机制中的ExtensionLoader类的objectFactory属性分析
  19. Android之RadioButton多行
  20. vp uml uninstall

热门文章

  1. 周练6(python脚本)
  2. Word14 互联网络发展状况统计报告office真题
  3. Minio--docker部署
  4. Excel工具(批量生成txt)
  5. appium:报错Message: Message: Parameters were incorrect. We wanted {&quot;required&quot;:[&quot;value&quot;]}
  6. element table 表格嵌套
  7. elementUI合并单元格
  8. linux 下 配置 nginx
  9. jquery 中根据日期计算天数,以及去掉字符串中的空格
  10. CentOS系统上离线部署MySQL