#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)的更多相关文章

  1. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  2. Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  3. (转)C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  4. c++11多线程---线程入口函数

    1.普通函数(线程入口) #include <thread> #include <iostream> void hello(const char *name) { std::c ...

  5. c++11多线程---线程操作

    1.等待线程执行完成 join() 方法数会阻塞主线程直到目标线程调用完毕,即join会直接执行该子线程的函数体部分. 2.暂停线程(线程休眠) 使用std::this_thread::sleep_f ...

  6. Python GIL、线程锁、信号量及事件

    GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...

  7. Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁

    多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...

  8. iOS 多线程的简单理解(4) 线程锁的简单使用

    要用到多线程 ,就不得不考虑,线程之间的交互,线程是否安全 推荐一个原文链接 是关于 线程锁的基本使用的  http://blog.csdn.net/qq_30513483/article/detai ...

  9. iOS 多线程之线程锁Swift-Demo示例总结

    线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...

随机推荐

  1. CDH5.13.3安装手册

    Server端需要打开端口 7180 7182 选址正确的版本,cdh版本不要高于cm版本 CM下载地址 http://archive.cloudera.com/cm5/cm/5/cloudera-m ...

  2. 从FBV到CBV一(开始)

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  3. openstack mitaka开启三层网络vxlan

    在这之前,先把之前基于flat模式创建的虚机,全部删除 控制节点: 配置 修改/etc/neutron/neutron.conf的[DEFAULT]区域 将 core_plugin = ml2 ser ...

  4. python中的定时任务

    使用threading模块中的Timer函数 from threading import Timer import time def execute_func(name, age, gender, h ...

  5. kubesphere集群搭建(多节点)

    kubesphere官网:https://kubesphere.io/docs/advanced-v2.0/zh-CN/introduction/intro/ 一.准备环境 1.准备服务器 maste ...

  6. Logback日志输出到ELK

    用docker-compose本机部署elk docker-compose.yml version: "3" services: es01: image: docker.elast ...

  7. linux 常用指令汇总

    新用户的一些操作: 查看当前用户:who am i(可以看到是否是伪终端)/也可以是whoami 添加用户:sudo adduser ..(用户名)..(此时创建的用户并未加入sudo组所以并不具有至 ...

  8. glsl:error C1105: cannot call a non-function

    今天写的shader编译过程中报了这个错误,而且错误行数是0.原因怎么找也找不到.后来发现原来是normalize方法写成了了normal正好和函数的形参名字一样. 特地记录一下.

  9. 02-springmvc分布式项目dataService项目配置

    spring总文件 文件名:applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> ...

  10. JS 转化为String的三种方法

    // 1. toString() var num = 8; var numString = num.toString(); console.log(numString); var result = t ...