c/c++ 多线程 层级锁
多线程 层级锁
当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个。同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...)
但是,有的时候,并不能同时得到所以要锁定的锁,必须是先锁定某个后,再锁定其他的,这种情况就不能使用std::lock函数了,怎么办呢,使用有顺序的锁。
额外说明:lock_guard<模板类> ,中模板类的实现。这个模板类只要实现mutex所需要的三个成员函数即可:lock(), unlock(), try_lock()。
例子:lock_guard的模板类hierarchical_mutex
class hierarchical_mutex{
std::mutex mtx;
unsigned long const hcl_val;
unsigned long pre_hcl_val;
static thread_local unsigned long this_hcl_val;
void check_for_hcl_violaction(){
if(this_hcl_val <= hcl_val){
throw std::logic_error("mutex hierarchy violated");
}
}
void update_hierarchy_value(){
pre_hcl_val = this_hcl_val;
this_hcl_val = hcl_val;
}
public:
explicit hierarchical_mutex(unsigned long val):
hcl_val(val), pre_hcl_val(0){}
void lock(){
check_for_hcl_violaction();
mtx.lock();
update_hierarchy_value();
}
void unlock(){
this_hcl_val = pre_hcl_val;
mtx.unlock();
}
bool try_lock(){
check_for_hcl_violaction();
if(!mtx.try_lock())
return false;
update_hierarchy_value();
return true;
}
};
顺序锁的应用例子:当要锁定时某个锁时,要先检查已经上锁的锁的序号,如果序号低于现在要锁的锁的序号的话就可以锁定,否则,抛出异常。
我也没理解锁的序号的真正含义,只是做个记录,抄一个例子。。。
#include <mutex>
#include <climits>//ULONG_MAX
#include <thread>
class hierarchical_mutex{
std::mutex mtx;
unsigned long const hcl_val;
unsigned long pre_hcl_val;
static thread_local unsigned long this_hcl_val;
void check_for_hcl_violaction(){
if(this_hcl_val <= hcl_val){
throw std::logic_error("mutex hierarchy violated");
}
}
void update_hierarchy_value(){
pre_hcl_val = this_hcl_val;
this_hcl_val = hcl_val;
}
public:
explicit hierarchical_mutex(unsigned long val):
hcl_val(val), pre_hcl_val(0){}
void lock(){
check_for_hcl_violaction();
mtx.lock();
update_hierarchy_value();
}
void unlock(){
this_hcl_val = pre_hcl_val;
mtx.unlock();
}
bool try_lock(){
check_for_hcl_violaction();
if(!mtx.try_lock())
return false;
update_hierarchy_value();
return true;
}
};
thread_local unsigned long
hierarchical_mutex::this_hcl_val(ULONG_MAX);
hierarchical_mutex high_level_mutex(10000);
hierarchical_mutex low_level_mutex(5000);
int do_low_level_stuff(){
return 1;
}
int low_level_func(){
std::lock_guard<hierarchical_mutex> lk(low_level_mutex);
return do_low_level_stuff();
}
void high_level_stuff(int param){
}
void high_level_func(){
std::lock_guard<hierarchical_mutex> lk(high_level_mutex);
high_level_stuff(low_level_func());
}
void thread_a(){
high_level_func();
}
hierarchical_mutex other_mutex(100);
void do_other_stuff(){
}
void other_stuff(){
high_level_func();
do_other_stuff();
}
void thread_b(){
std::lock_guard<hierarchical_mutex> lk(other_mutex);
other_stuff();
}
int main(){
//锁定顺序合法(因为先锁的大的,后锁的小的)
std::thread a(thread_a);
//锁定顺序非法(因为先锁的小的,后锁的大的)
std::thread b(thread_b);
a.join();
b.join();
}
github源代码
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 多线程 层级锁的更多相关文章
- 在SQL Serve里停用行和页层级锁
今天我想谈下SQL Server里另一个非常有趣的话题:在SQL Server里停用行和页层级锁.在SQL Server里,每次你重建一个索引,你可以使用ALLOW_ROW_LOCKS 和ALLOW_ ...
- SDL 开发实战(七): SDL 多线程与锁机制
为什么要用多线程?在音视频领域主要是实现音视频同步.实现了音视频同步,我们的播放器就基本上合格了. 这里我们将讲解一下SDL的多线程与锁机制. 多线程的好处主要是能使程序更加充分利用硬件(主要是CPU ...
- C 语言多线程与锁机制
C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...
- Android并发编程 多线程与锁
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 前一篇Android并发编程开篇呢,主要是简单介绍一下线程以及 ...
- 多线程-synchronized锁
package 多线程.synchronized锁; /*. * * * * */ public class Sale implements Runnable { ; @Override public ...
- 多线程-lock锁
package 多线程.lock锁; import java.util.concurrent.locks.ReentrantLock; /*. * * //同步代码块 * * */ public cl ...
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- Java多线程--公平锁与非公平锁
上一篇文章介绍了AQS的基本原理,它其实就是一个并发包的基础组件,用来实现各种锁,各种同步组件的.它包含了state变量.加锁线程.等待队列等并发中的核心组件,现在我们来看一下多线程获取锁的顺序问题. ...
- JAVA多线程与锁机制
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...
随机推荐
- windows下golang实现Kfaka消息发送及kafka环境搭建
kafka环境搭建: 一.安装配置java-jdk (1)kafka需要java环境,安装java-jdk,下载地址:https://www.oracle.com/technetwork/java/j ...
- 性能调优之Transformation
优化之Aggregator组件 优化之Custom组件 优化之Joiner组件 优化之Lookup组件 优化之Normalizer组件 优化之Sequence Generator组件 优化之Sorte ...
- 侯哥的Python分享
侯哥语录 我曾经是一个职业教育者,现在是一个自由开发者.我希望我的分享可以和更多人一起进步.分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么.当你还没 ...
- Xamarin.Android 集成百度地图SDK
前言:趁着周六闲得没事干,赶紧搞一搞Xamarin,最近也是怪无聊的,枯燥的生活不如打几行代码带劲:好了我们进入正题 我这篇文章时参考一位大佬的博客进行改变的,当然他写的需要一定的经验才可以看得懂,我 ...
- 『Candies 差分约束系统』
差分约束系统 我们先来认识一下差分约束系统鸭! 差分约束系统是一种特殊的\(n\)元一次不等式组,它包含了\(n\)个变量\(x_1-x_n\)以及\(m\)个不等式(约束条件).其中每一个不等式形如 ...
- 关于ML.NET v0.6的发布说明
ML.NET 0.6版本提供了几项令人兴奋的新增功能: 用于构建和使用机器学习模型的新API 我们主要关注的是发布用于构建和使用模型的新ML.NET API的第一次迭代.这些新的,更灵活的API支持新 ...
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲.OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通过Spring Session+Redi ...
- SpringBoot入门教程(十二)DevTools热部署
devtools模块,是为开发者服务的一个模块.主要的功能就是代码修改后一般在5秒之内就会自动重新加载至服务器,相当于restart成功.与JRebel不同的是,JRebel是一款商业插件,devto ...
- 前端笔记之JavaScript(四)关于函数、作用域、闭包那点事
一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...
- leetcode — largest-rectangle-in-histogram
import java.util.Stack; /** * * Source : https://oj.leetcode.com/problems/largest-rectangle-in-histo ...