c++11多线程---线程锁(mutex)
#include<mutex>
包含四类锁:
1 std::mutex 最基本也是最常用的互斥类
2 std::recursive_mutex 同一线程内可递归(重入)的互斥类
3 std::timed_mutex 除具备mutex功能外,还提供了带时限请求锁定的能力
4 std::recursive_timed_mutex 同一线程内可递归(重入)的timed_mutex
锁的操作:
1、lock, try_lock, unlock
lock:
如果互斥量没有被锁住,则调用线程将该mutex锁住,直到调用线程调用unlock释放。
如果mutex已被其它线程lock,则调用线程将被阻塞,直到其它线程unlock该mutex。
如果当前mutex已经被调用者线程锁住,则std::mutex死锁,而recursive系列则成功返回。
try_lock:
如果互斥量没有被锁住,则调用线程将该mutex锁住(返回true),直到调用线程调用unlock释放。
如果mutex已被其它线程lock,则调用线程将失败,并返回false。
如果当前mutex已经被调用者线程锁住,则std::mutex死锁,而recursive系列则成功返回true。
#include <iostream>
#include <thread>
#include <mutex> void inc(std::mutex &mutex, int loop, int &counter) {
for (int i = ; i < loop; i++) {
mutex.lock();
++counter;
mutex.unlock();
}
}
int main() {
std::thread threads[];
std::mutex mutex;
int counter = ; for (std::thread &thr: threads) {
thr = std::thread(inc, std::ref(mutex), , std::ref(counter));
}
for (std::thread &thr: threads) {
thr.join();
} // 输出:5000,如果inc中调用的是try_lock,则此处可能会<5000
std::cout << counter << std::endl; return ;
}
//: g++ -std=c++11 main.cpp
参考 https://www.jianshu.com/p/96eac2d183b1
2、try_lock_for, try_lock_until
这两个函数仅用于timed系列的mutex(std::timed_mutex, std::recursive_timed_mutex),函数最多会等待指定的时间,如果仍未获得锁,则返回false。除超时设定外,这两个函数与try_lock行为一致。
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono> void run500ms(std::timed_mutex &mutex) {
auto _500ms = std::chrono::milliseconds();
if (mutex.try_lock_for(_500ms)) {
std::cout << "获得了锁" << std::endl;
} else {
std::cout << "未获得锁" << std::endl;
}
}
int main() {
std::timed_mutex mutex; mutex.lock();
std::thread thread(run500ms, std::ref(mutex));
thread.join();
mutex.unlock(); return ;
}
//输出:未获得锁
参考 https://www.jianshu.com/p/96eac2d183b1
3、lock_guard、unique_lock、std::call_once、std::try_lock、std::lock(略)
c++11多线程---线程锁(mutex)的更多相关文章
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- Python多线程-线程锁
多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...
- (转)C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- c++11多线程---线程入口函数
1.普通函数(线程入口) #include <thread> #include <iostream> void hello(const char *name) { std::c ...
- c++11多线程---线程操作
1.等待线程执行完成 join() 方法数会阻塞主线程直到目标线程调用完毕,即join会直接执行该子线程的函数体部分. 2.暂停线程(线程休眠) 使用std::this_thread::sleep_f ...
- Python GIL、线程锁、信号量及事件
GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...
- Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁
多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...
- iOS 多线程的简单理解(4) 线程锁的简单使用
要用到多线程 ,就不得不考虑,线程之间的交互,线程是否安全 推荐一个原文链接 是关于 线程锁的基本使用的 http://blog.csdn.net/qq_30513483/article/detai ...
- iOS 多线程之线程锁Swift-Demo示例总结
线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...
随机推荐
- 线程的函数中调用MFC对话框类的变量
线程的函数中调用MFC对话框类的变量多线程传输文件的对话框 现在想要在对话框上添加一个进度条 为进度条映射变量m_progress这就需要在传输一段文件后就更新m_progress的值使进度条前进 也 ...
- chrome 浏览器安装 postman
chrome 浏览器安装 postman(插件下载见文章末尾) 1.安装方法 将下载的crx插件拖拽到chrome浏览器即可安装成功. 2.特殊情况 问题: chrome73版本后拖拽安装chrome ...
- dedecms 调用内容页分页
arc.archives.class.php $TRUEfilename = $this->GetTruePath().$fileFirst."_".$i.".&q ...
- 韦东山嵌入式Linux学习笔记08--中断体系结构
中断是什么? 举个栗子, 系统怎么知道你什么时候插入鼠标这个设备? 可以有两种处理方式: 1. 查询方式: 轮询去检测是否有设备插入; 2. 中断的方式 当鼠标插入这个事件发生时, 置位某个寄存器,告 ...
- ffmpeg函数01__swr_convert()
swr_convert() 针对每一帧音频的处理.把一帧帧的音频作相应的重采样 int swr_convert(struct SwrContext *s, uint8_t **out, int out ...
- Tableau预测
Tableau可以通过对现有的数据进行预测.
- java 文件上传与解析(excel,txt)
excel上传与解析 https://blog.csdn.net/zsysu_it/article/details/79074067 txt解析 https://blog.csdn.net/CSDNw ...
- VMware Horizon Client剪贴板异常问题解决
接到用户反馈现象是:登录ERP系统操作是,无法复制粘贴本地电脑上的数据. 处理过程: 1.在域控服务器上建立独立的Horizon Computer OU,把所有RDS加入在改OU中 2.针对Horiz ...
- The Preliminary Contest for ICPC Asia Shenyang 2019 C. Dawn-K's water
题目:https://nanti.jisuanke.com/t/41401思路:完全背包 #include<bits/stdc++.h> using namespace std; int ...
- tp6中使用微信支付sdk
一.下载微信支付sdk 二.将lib文件夹下的文件复制到目录:extend->WxPay 将example文件夹下的WxPay.Config.php文件也复制到:extend->WxPay ...