C++11并发之std::mutex
1、 头文件。
- std::mutex,最基本的 Mutex 类。
- std::recursive_mutex,递归 Mutex 类。
- std::time_mutex,定时 Mutex 类。
- std::recursive_timed_mutex,定时递归 Mutex 类。
- std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。
- std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。
- std::once_flag
- std::adopt_lock_t
- std::defer_lock_t
- std::try_to_lock_t
函数
- std::try_lock,尝试同时对多个互斥量上锁。
- std::lock,可以同时对多个互斥量上锁。
- std::call_once,如果多个线程需要同时调用某个函数,call_once 可以保证多个线程对该函数只调用一次。
2、std::mutex。
std::mutex 的成员函数
#include //std::cout#include //std::thread#include //std::mutex#include //std::atomicusing namespace std;atomic_int counter{ 0 }; //原子变量mutex g_mtx; //互斥量void fun(){for (int i = 0; i <</span> 1000000; ++i){if (g_mtx.try_lock()) //尝试是否可以加锁{++counter;g_mtx.unlock(); //解锁}}}int main(){thread threads[10];for (int i = 0; i <</span> 10; ++i){threads[i] = thread(fun);}for (auto & th : threads){th.join();}cout << "counter=" << counter << endl;system("pause");return 0;}运行结果:counter=1342244
3、std::recursive_mutex。
#include //std::cout#include //std::thread#include //std::mutexusing namespace std;mutex g_mutex;void threadfun1(){cout << "enter threadfun1" << endl;lock_guard lock(g_mutex);cout << "execute threadfun1" << endl;}void threadfun2(){cout << "enter threadfun2" << endl;lock_guard lock(g_mutex);threadfun1();cout << "execute threadfun2" << endl;}int main(){threadfun2(); //死锁//Unhandled exception at 0x758BC42D in Project2.exe: Microsoft C++ exception: std::system_error at memory location 0x0015F140.return 0;}运行结果:enter threadfun2enter threadfun1//就会产生死锁
#include //std::cout#include //std::thread#include //std::mutexusing namespace std;recursive_mutex g_rec_mutex;void threadfun1(){cout << "enter threadfun1" << endl;lock_guard lock(g_rec_mutex);cout << "execute threadfun1" << endl;}void threadfun2(){cout << "enter threadfun2" << endl;lock_guard lock(g_rec_mutex);threadfun1();cout << "execute threadfun2" << endl;}int main(){threadfun2(); //利用递归式互斥量来避免这个问题return 0;}运行结果:enter threadfun2enter threadfun1execute threadfun1execute threadfun2
4、std::time_mutex。
#include //std::cout#include //std::thread#include //std::mutexusing namespace std;std::timed_mutex g_t_mtx;void fun(){while (!g_t_mtx.try_lock_for(std::chrono::milliseconds(200))){cout << "-";}this_thread::sleep_for(std::chrono::milliseconds(1000));cout << "*" << endl;g_t_mtx.unlock();}int main(){std::thread threads[10];for (int i = 0; i <</span> 10; i++){threads[i] = std::thread(fun);}for (auto & th : threads){th.join();}return 0;}运行结果:------------------------------------*----------------------------------------*-----------------------------------*------------------------------*-------------------------*--------------------*---------------*----------*-----**
5、std::lock_guard 与 std::unique_lock。
#include //std::cout#include //std::thread#include //std::mutex#include //std::atomicusing namespace std;mutex g_mtx1;atomic_int num1{ 0 };void fun1(){for (int i = 0; i <</span> 10000000; i++){unique_lock ulk(g_mtx1);num1++;}}mutex g_mtx2;atomic_int num2{ 0 };void fun2(){for (int i = 0; i <</span> 10000000; i++){lock_guard lckg(g_mtx2);num2++;}}int main(){thread th1(fun1);thread th2(fun1);th1.join();th2.join();cout << "num1=" << num1 << endl;thread th3(fun2);thread th4(fun2);th3.join();th4.join();cout << "num2=" << num2 << endl;return 0;}运行结果:num1=20000000num2=20000000
C++11并发之std::mutex的更多相关文章
- C++11并发之std::thread<转>
最近技术上没什么大的收获,也是悲催的路过~ 搞一点新东西压压惊吧! C++11并发之std::thread 知识链接: C++11 并发之std::mutex C++11 并发之std::atomic ...
- c++11并发之std::thread
知识链接: https://www.cnblogs.com/lidabo/p/7852033.html 构造函数如下: ) thread() noexcept; initialization() te ...
- C++11并发——多线程std::mutex (二)
https://www.cnblogs.com/haippy/p/3237213.html Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mute ...
- C++11 并发之std::thread std::mutex
https://www.cnblogs.com/whlook/p/6573659.html (https://www.cnblogs.com/lidabo/p/7852033.html) C++:线程 ...
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- C++11 并发指南三(std::mutex 详解)(转)
转自:http://www.cnblogs.com/haippy/p/3237213.html 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::th ...
- 【C/C++开发】C++11 并发指南三(std::mutex 详解)
本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...
- C++11:基于std::queue和std::mutex构建一个线程安全的队列
C++11:基于std::queue和std::mutex构建一个线程安全的队列 C++中的模板std::queue提供了一个队列容器,但这个容器并不是线程安全的,如果在多线程环境下使用队列,它是不能 ...
- C++11 并发指南------std::thread 详解
参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...
随机推荐
- Ubuntu redmine 安装
/******************************************************************** * Ubuntu redmine 安装 * 说明: * 随着 ...
- bzoj 2744 朋友圈
题目大意: 两个国家 各有A和B个人,每个人有一个数值. 若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友 若两个B国的人满足$val_ ...
- mysql 数据库的名称不能以数字开头
mysql 数据库的名称不能以数字开头
- 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记
设计思路: (1) 一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2) “10ms延迟模块”检测到H2L_Sig高电平, ...
- 【OpenJ_Bailian - 4070 】全排列
全排列 Descriptions: 对于数组[1, 2, 3],他们按照从小到大的全排列是 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 现在给你一个正整数n,n小于8,输出 ...
- 【OpenJ_Bailian - 2945】拦截导弹(动态规划)
拦截导弹 Descriptions: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高 ...
- MongoDB集群跨网络、跨集群同步方案
MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...
- Activiti6.0教程 Eclipse安装Activiti Diagram插件(一)
最近这段时间打算出一个Activiti6.0的详细教程,Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交 ...
- 我的周记5——"侵略如火,不动如山"
这周发生的事儿 最近同事晋升的参加答辩,还有的同事要转岗走了.难受... 有时候自己常常想,我是不是应该也要走了. 这儿的人好优秀呀,又舍不得离开.但是这里太安逸了,接触不到技术,靠自学呢 又感觉力不 ...
- BIOS 和UEFI的区别
BIOS先要对CPU初始化,然后跳转到BIOS启动处进行POST自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程:而UE ...