std::mutex
- 构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的。
- lock(),调用线程将锁住该互斥量。线程调用该函数会发生下面 3 种情况:(1). 如果该互斥量当前没有被锁住,则调用线程将该互斥量锁住,直到调用 unlock之前,该线程一直拥有该锁。(2). 如果当前互斥量被其他线程锁住,则当前的调用线程被阻塞住。(3). 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)。
- unlock(), 解锁,释放对互斥量的所有权。
- try_lock(),尝试锁住互斥量,如果互斥量被其他线程占有,则当前线程也不会被阻塞。线程调用该函数也会出现下面 3 种情况,(1). 如果当前互斥量没有被其他线程占有,则该线程锁住互斥量,直到该线程调用 unlock 释放互斥量。(2). 如果当前互斥量被其他线程锁住,则当前调用线程返回 false,而并不会被阻塞掉。(3). 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)。
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex volatile int counter(); // volatile被设计用来修饰不同线程访问和修改的变量,貌似硬件中比较多
std::mutex mtx; // locks access to counter,只有拥有锁得线程才能执行 void attempt_10k_increases() {
for (int i=; i<; ++i) {
if (mtx.try_lock()) { // try_lock()企图上锁,如果被锁住则返回false线程不阻塞,这是和lock不同的地方
++counter;
mtx.unlock();//解锁
}
}
} int main (int argc, const char* argv[]) {
std::thread threads[];
for (int i=; i<; ++i)
threads[i] = std::thread(attempt_10k_increases); for (auto& th : threads) th.join();//join主线程等待子线程执行结束
std::cout << counter << " successful increases of the counter.\n";
getchar();
return ;
} 附:
void attempt_10k_increases(int num) {
mtx.lock();
for (int i=; i<; ++i) {
std::cout << num << "----"<<++counter<<std::endl;
}
Sleep();
mtx.unlock();//解锁
} int main (int argc, const char* argv[]) {
std::thread threads[];
threads[] = std::thread(attempt_10k_increases, );
threads[] = std::thread(attempt_10k_increases, );
threads[] = std::thread(attempt_10k_increases, ); for (auto& th : threads) th.join();//join主线程等待子线程执行结束
std::cout << counter << " successful increases of the counter.\n";
getchar();
return ;
}
上面代码的执行顺序为什么和线程的创建顺序有关,我感觉当解锁时,其他线程时随机的,但例子显示顺序的,我猜是创建时系统指定了执行的顺序?
具体参考:http://www.cnblogs.com/haippy/p/3237213.html
std::mutex的更多相关文章
- 模板std::mutex用法:
std::mutex mymutex; std::lock_guard<std::mutex> lock(mymutex);
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- C++11并发——多线程std::mutex (二)
https://www.cnblogs.com/haippy/p/3237213.html Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mute ...
- 基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...
- std::mutex 引起的 C2280 尝试引用已删除的函数
起因是把之前写的类中的 mutex 使用了(之前注释掉了没用到这个变量); 或者说添加了一个 mutex 变量, 然后 这个类有嵌套在了 其类的 map 中使用, 然后 编译 就报错 ` C2280 ...
- std::mutex与pthread mutex区别
Linux下 pthread mutex * PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁.当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁. ...
- C++11 并发指南三(std::mutex 详解)(转)
转自:http://www.cnblogs.com/haippy/p/3237213.html 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::th ...
- 使用std::mutex取代QMutex
为了保证对某个资源的操作是原子性的(对资源读写时,只有当前的操作结束,才允许另外线程对其操作,这里有个理解误区,资源操作原子性不是说,当前某个线程获得了某个资源使用权,然后线程执行时间完毕,要切换线程 ...
- C++11并发之std::mutex
知识链接: C++11并发之std::thread 本文概要: 1. 头文件. 2.std::mutex. 3.std::recursive_mutex. 4.std::time_mutex. 5 ...
随机推荐
- win10 配置 python3 + opencv3.2 + VideoCapture
最近需要在 win10 上进行图片处理,使用深度学习框架 tensorflow ,所以安装了python3.5 + opencv3.2 + tensorflow + VideoCapture + PI ...
- hibernate开发流程
开发流程,注意:每个hibernate版本在集成的时候是不太一样的.本次使用的是hibernate-distribution-3.6.10.Final-dist 一.开发流程 1)在数据库中创建表,代 ...
- unity, water cube
<纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...
- Object-C中的数字对象
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- jmx 配置
1.启动添加jmx参数 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom. ...
- 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...
- PHP域名whois查询代码(数据源万网、新网)
对于whois查询,数据来自万网.新网,数据也比较权威,需要的朋友可以参考下. 万网 whois(使用的接口为万网提供合法接口) function whois_hichina($domain) { ...
- atitit.loading的设计与实现控件选型attilax 总结
atitit.loading的设计与实现控件选型attilax 总结 1. Percentage Loader(推荐) 1 1.1. 起始百分比::调整 progress 1 2. CSS3 Loa ...
- python生成器,函数,数组
1.什么是生成器用一个比喻来形容,工厂中生产保龄球的流水线,机器每次只生产一个保龄球,下次继续生产下一个,直到停止(原料不足,停止供电等条件)为止.机器就是我们的生成器. 2.使用示例在python中 ...
- 每日英语:China's Bad Earth
In Dapu, a rain-drenched rural outpost in the heart of China's grain basket, a farmer grows crops th ...