博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11 std::unique_lock与std::lock_guard的区别及多线程应用实例
阅读量:6169 次
发布时间:2019-06-21

本文共 1803 字,大约阅读时间需要 6 分钟。

hot3.png

C++11std::unique_lock与std::lock_guard的区别及多线程应用实例

C++多线程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。

针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构。通过对lock和unlock进行一次薄的封装,实现自动unlock的功能。

std::mutex mut; void insert_data(){    std::lock_guard
lk(mut); queue.push_back(data);} void process_data(){ std::unqiue_lock
lk(mut); queue.pop();}

std::unique_lock 与std::lock_guard都能实现自动加锁与解锁功能,但是std::unique_lock要比std::lock_guard更灵活,但是更灵活的代价是占用空间相对更大一点且相对更慢一点。

 

通过实现一个线程安全的队列来说明两者之间的差别。

template 
class ThreadSafeQueue{public: void Insert(T value); void Popup(T &value); bool Empety(); private: mutable std::mutex mut_; std::queue
que_; std::condition_variable cond_;};template
void ThreadSafeQueue::Insert(T value){ std::lock_guard
lk(mut_); que_.push_back(value); cond_.notify_one();} template
void ThreadSafeQueue::Popup(T &value){ std::unique_lock
lk(mut_); cond_.wait(lk, [this]{return !que_.empety();}); value = que_.front(); que_.pop();} template
bool ThreadSafeQueue::Empty() const{ std::lock_guard
lk(mut_); return que_.empty();}

上面代码只实现了关键的几个函数,并使用了C++11新引入的condition_variable条件变量。从Popup与Inert两个函数看std::unique_lock相对std::lock_guard更灵活的地方在于在等待中的线程如果在等待期间需要解锁mutex,并在之后重新将其锁定。而std::lock_guard却不具备这样的功能。

是C++11新引入的功能,lambda表达式,是一种匿名函数。方括号内表示捕获变量。当lambda表达式返回true时(即queue不为空),wait函数会锁定mutex。当lambda表达式返回false时,wait函数会解锁mutex同时会将当前线程置于阻塞或等待状态。

还存在另一种读写锁,但是并没有引入C++11,但是boost库提供了对应的实现。读写锁主要适合在于共享数据更新频率较低,但是读取共享数据频率较高的场合。

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/1426828/blog/1793384

你可能感兴趣的文章
Arraylist动态扩容详解
查看>>
%cd%及%~dp0批处理命令的详解
查看>>
MySQL数据库负载很高连接数很多怎么处理
查看>>
关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
查看>>
Cent OS 环境下 samba服务器的搭建
查看>>
vCloud Director 1.5.1 Install Procedure
查看>>
hive 中的多列进行group by查询方法
查看>>
Cisco统一通信---视频部分
查看>>
nginx编译及参数详解
查看>>
VMware下PM魔术分区使用教程
查看>>
nslookup错误
查看>>
我的友情链接
查看>>
Supported plattforms
查看>>
做自己喜欢的事情
查看>>
CRM安装(二)
查看>>
Eclipse工具进行Spring开发时,Spring配置文件智能提示需要安装STS插件
查看>>
NSURLCache内存缓存
查看>>
jquery click嵌套 事件重复注册 多次执行的问题
查看>>
Dev GridControl导出
查看>>
开始翻译Windows Phone 8 Development for Absolute Beginners教程
查看>>