经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
c/c++ 多线程 层级锁
来源:cnblogs  作者:小石王  时间:2018/11/6 10:17:45  对本文有异议

多线程 层级锁

当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个。同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...)

但是,有的时候,并不能同时得到所有要锁定的锁,必须是先锁定某个后,再锁定其他的,这种情况就不能使用std::lock函数了,怎么办呢,使用有顺序的锁。

额外说明:lock_guard<模板类> ,中模板类的实现。这个模板类只要实现mutex所需要的三个成员函数即可:lock(), unlock(), try_lock()。

例子:lock_guard的模板类hierarchical_mutex

  1. class hierarchical_mutex{
  2. std::mutex mtx;
  3. unsigned long const hcl_val;
  4. unsigned long pre_hcl_val;
  5. static thread_local unsigned long this_hcl_val;
  6. void check_for_hcl_violaction(){
  7. if(this_hcl_val <= hcl_val){
  8. throw std::logic_error("mutex hierarchy violated");
  9. }
  10. }
  11. void update_hierarchy_value(){
  12. pre_hcl_val = this_hcl_val;
  13. this_hcl_val = hcl_val;
  14. }
  15. public:
  16. explicit hierarchical_mutex(unsigned long val):
  17. hcl_val(val), pre_hcl_val(0){}
  18. void lock(){
  19. check_for_hcl_violaction();
  20. mtx.lock();
  21. update_hierarchy_value();
  22. }
  23. void unlock(){
  24. this_hcl_val = pre_hcl_val;
  25. mtx.unlock();
  26. }
  27. bool try_lock(){
  28. check_for_hcl_violaction();
  29. if(!mtx.try_lock())
  30. return false;
  31. update_hierarchy_value();
  32. return true;
  33. }
  34. };

顺序锁的应用例子:当要锁定时某个锁时,要先检查已经上锁的锁的序号,如果序号低于现在要锁的锁的序号的话就可以锁定,否则,抛出异常。

我也没理解锁的序号的真正含义,只是做个记录,抄一个例子。。。

  1. #include <mutex>
  2. #include <climits>//ULONG_MAX
  3. #include <thread>
  4. class hierarchical_mutex{
  5. std::mutex mtx;
  6. unsigned long const hcl_val;
  7. unsigned long pre_hcl_val;
  8. static thread_local unsigned long this_hcl_val;
  9. void check_for_hcl_violaction(){
  10. if(this_hcl_val <= hcl_val){
  11. throw std::logic_error("mutex hierarchy violated");
  12. }
  13. }
  14. void update_hierarchy_value(){
  15. pre_hcl_val = this_hcl_val;
  16. this_hcl_val = hcl_val;
  17. }
  18. public:
  19. explicit hierarchical_mutex(unsigned long val):
  20. hcl_val(val), pre_hcl_val(0){}
  21. void lock(){
  22. check_for_hcl_violaction();
  23. mtx.lock();
  24. update_hierarchy_value();
  25. }
  26. void unlock(){
  27. this_hcl_val = pre_hcl_val;
  28. mtx.unlock();
  29. }
  30. bool try_lock(){
  31. check_for_hcl_violaction();
  32. if(!mtx.try_lock())
  33. return false;
  34. update_hierarchy_value();
  35. return true;
  36. }
  37. };
  38. thread_local unsigned long
  39. hierarchical_mutex::this_hcl_val(ULONG_MAX);
  40. hierarchical_mutex high_level_mutex(10000);
  41. hierarchical_mutex low_level_mutex(5000);
  42. int do_low_level_stuff(){
  43. return 1;
  44. }
  45. int low_level_func(){
  46. std::lock_guard<hierarchical_mutex> lk(low_level_mutex);
  47. return do_low_level_stuff();
  48. }
  49. void high_level_stuff(int param){
  50. }
  51. void high_level_func(){
  52. std::lock_guard<hierarchical_mutex> lk(high_level_mutex);
  53. high_level_stuff(low_level_func());
  54. }
  55. void thread_a(){
  56. high_level_func();
  57. }
  58. hierarchical_mutex other_mutex(100);
  59. void do_other_stuff(){
  60. }
  61. void other_stuff(){
  62. high_level_func();
  63. do_other_stuff();
  64. }
  65. void thread_b(){
  66. std::lock_guard<hierarchical_mutex> lk(other_mutex);
  67. other_stuff();
  68. }
  69. int main(){
  70. //锁定顺序合法(因为先锁的大的,后锁的小的)
  71. std::thread a(thread_a);
  72. //锁定顺序非法(因为先锁的小的,后锁的大的)
  73. std::thread b(thread_b);
  74. a.join();
  75. b.join();
  76. }

github源代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号