muduo C++ 网络库——线程同步精要(1):互斥锁

本文深入探讨了muduo C++网络库中的线程同步,重点在于互斥锁的使用。文章强调了只使用非递归的mutex,避免死锁,并提供了具体的代码示例来说明如何防止和解决死锁问题,以提高多线程编程的健壮性。
摘要由CSDN通过智能技术生成

互斥器:使用得最多的同步原语

互斥锁的详细介绍在这一篇博文中:

互斥锁

 

概念补充:RAII——资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。只要对象能正确地析构,就不会出现资源泄漏问题。

 

互斥器保护了临界区,任何一个时刻最多只能有一个线程在此mutex划出的临界区内活动。单独使用mutex时,主要为了保护共享数据。原则:

-用RAII手法封装mutex的创建,销毁,加锁,解锁四个操作。

-只用非递归的mutex(即不可重入的mutex)

-不手工调用lock()和unlock()函数,一切交给Guard对象的构造和析构函数负责。Guard对象的生命期正好等于临界区。

-每次构造Guard对象的时候,思考已持有的锁,防止因加锁顺序不同而导致死锁。

 

 

1.只使用非递归的mutex

 mutex分为递归(recursive)非递归(non-recursive)两种。另一种叫法是:可重入非可重入

 

在同一线程里多次对non-recursive mutex加锁会立刻导致死锁,而recursive mutex不用考虑线程自己把自己锁死

但recursive mutex可能会隐藏代码里的一些问题,例如:

拿到一个锁就开始修改对象,但是没想到外层代码也拿到了锁,正在修改同一个对象。

[cpp]  view plain   copy
  1. MutexLock mutex;  
  2. std::vector<Foo> foos;  
  3.   
  4. void post(const Foo& f)  
  5. {  
  6.     MutexLockGuard lock(mutex);  
  7.     foos.push_back(f);  
  8. }  
  9.   
  10. void traverse()  
  11. {  
  12.     MutexLockGuard lock(mutex);  
  13.     for (std::vector<Foo>::const_iterator it = foos.begin(); it != foos.end(); ++it)  
  14.     {  
  15.         it->doit();  
  16.     }  
  17. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值