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::atomic
using 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::mutex
using 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 threadfun2
enter threadfun1
//就会产生死锁
#include //std::cout
#include //std::thread
#include //std::mutex
using 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 threadfun2
enter threadfun1
execute threadfun1
execute threadfun2
4、std::time_mutex。
#include //std::cout
#include //std::thread
#include //std::mutex
using 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::atomic
using 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=20000000
num2=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 ...
随机推荐
- Go语言mgo
本文重点介绍mgo使用,仅简单介绍mongodb. mongodb特性 mongdb简单介绍 注意: 上图已经告知我们mongo不支持事务,在开发项目应用时,想要保证数据的完整性请考虑关系型数据库 ...
- AngularJS 指令(Directives)实践指南
指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在 ...
- jfreechart应用2--柱状图(作者:百度 被风吹过的日子)
jfreechart应用2--柱状图 二. 柱状图 在WebRoot目录下建立bar目录,用来存放柱状图的各个例子.首先在该目录下建立一个sample1.jsp文件,让我们来看一个简单的柱状图的例 ...
- C# QRCode 二维码
/*********************************************************************** * C# QRCode 二维码 * 说明: * 本文记 ...
- Image2Caption
定义 图像标注或语言生成图像问题把计算机视觉与自然语言处理联系在了一起,是广义的人工智能领域的一大难题.通常涉及到特征提取(用cnn提取出图像内部不为人类感知的向量特征)和语言模型建立.为图像提取文字 ...
- 利用HashMap存取对象并获得键值集合
1.HashMap 已实现的接口 Serializable, Cloneable, Map<K,V> 2.方法摘要 相关代码 /** * * @param ha * write(HashM ...
- layui 添加第三方插件
关于 layui 添加第三方 JS 库 在写公司项目时,需要将第三方 JS 库整合到 layui 中,具体操作如下: 示例:https://www.jianshu.com/p/7a182e8bff10 ...
- POJ3682;King Arthur's Birthday Celebration(期望)
传送门 题意 进行翻硬币实验,若k次向上则结束,进行第n次实验需花费2*n-1的费用,询问期望结束次数及期望结束费用 分析 我们令f[i]为结束概率 \[f[i]=C_{i-1}^{k-1}*p^k* ...
- bzoj 4481: [Jsoi2015]非诚勿扰【期望+树状数组】
首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 \[ p*(1-p)^{i-1}+p*(1-p)^{i-1+n}+p*(1-p)^{i-1+n}+- \] \[ ...
- springboot(十)SpringBoot消息中间件RabbitMQ
github地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 1. ...