C++多线程-chap2多线程通信和同步5
这里,只是记录自己的学习笔记。
unique_lock c++11
- unique_lock C++11 实现可移动的互斥体所有权包装器
- 支持临时释放锁 unlock
- 支持 adopt_lock (已经拥有锁,不加锁,出栈区会释放)
- 支持 defer_lock (延后拥有,不加锁,出栈区不释放)
- 支持 try_to_lock 尝试获得互斥的所有权而不阻塞,获取失败退出栈区不会释放,通过onws_lock() 函数判断
- 支持超时参数,超时不拥有锁
1 #include <iostream> 2 #include <string> 3 #include <mutex> 4 #include <thread> 5 6 using namespace std; 7 8 int main() { 9 { 10 static mutex mux; 11 { 12 unique_lock<mutex> lock(mux); 13 lock.unlock(); 14 15 //临时释放锁 16 lock.lock(); 17 } 18 19 { 20 //已经拥有锁,不锁定,退出解锁 21 mux.lock(); 22 unique_lock<mutex> lock(mux, adopt_lock); 23 } 24 25 { 26 //延后加锁,不拥有(_Owns属性为false),退出不解锁 27 unique_lock<mutex> lock(mux, defer_lock); 28 29 //加锁,退出栈区 解锁 30 lock.lock(); 31 } 32 33 { 34 35 mux.lock(); 36 //尝试加锁,不阻塞,失败不拥有锁 37 unique_lock<mutex> lock(mux, try_to_lock); 38 if (lock.owns_lock()) { 39 cout << "owns_lock" << endl; 40 } 41 else { 42 cout << "not owns_lock " << endl; 43 } 44 mux.unlock(); 45 } 46 } 47 48 getchar(); 49 return 0; 50 }
shared_lock 共享锁(读锁)
unique_lock 互斥锁(写锁)
shared_lock C++14 实现可移动的共享互斥体所有权封装器 explicit shared_lock(mutex_type& _Mtx) : _Pmtx(_STD addressof(_Mtx)), _Owns(true) { // construct with mutex and lock shared _ Mtx.lock_shared(); }
1 #include <iostream> 2 #include <string> 3 #include <thread> 4 #include <mutex> 5 #include <shared_mutex> 6 using namespace std; 7 8 int main() { 9 { 10 //共享锁 11 static shared_timed_mutex tmux; 12 //读取锁 --> 共享锁 13 { 14 //调用共享锁 15 shared_lock<shared_timed_mutex> lock(tmux); 16 //退出栈区,释放共享锁 17 cout << "read data " << endl; 18 } 19 20 //写入锁 --> 互斥锁 21 { 22 unique_lock<shared_timed_mutex> lock(tmux); 23 cout << "write data " << endl; 24 } 25 } 26 27 28 return 0; 29 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-11-22 Linux socket program Demo1(client & server)
2019-11-22 netstat查看端口状态
2019-11-22 获取主机信息,网络信息AIP,getsockname,getpeername,getservbyname,getservbyport,inet_ntop,inet_pton
2019-11-22 linux系统中启动daytime服务