现在的位置: 首页 > 综合 > 正文

利用boost提供的库构建读写锁与互斥锁

2013年05月06日 ⁄ 综合 ⁄ 共 1341字 ⁄ 字号 评论关闭

原文地址:http://herojiang.iteye.com/blog/432394

boost库中提供了的mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁。 

一种简易的构建方法如下: 
首先看看mutex类,主要用到下面两种. 

mutex类: 
  boost::mutex,  boost::shared_mutex 
其中mutex主要有lock与unlock方法,shared_mutex除了提供lock与un_lock方法之外,还有shared_lock与shared_unlock方法。 

lock模板 
  boost::unique_lock<T> 
  boost::shared_lock<T> 

其中uniq_lock<T>中T的可以为mutex类中的任意一种,只要其提供了lock与unlock方法即可,但是也可以为shared_mutex,如果是shared_mutex,那么在boost::uniq_lock<boost::shared_mutex>类的对象构造函数构造时候, 会自动调用shared_mutex的shared_lock方法,析够函数里,会自动调用shared_mutex的shared_unlock方法;如果是boost::uniq_lock<boost::mutex>,则与之对应,分别自动调用lock与unlock方法。那么,我们可以定义以下的类型来实现读写锁: 

typedef boost::shared_mutex rwmutex; 
typedef boost::shared_lock<rwmutex> readLock; 
typedef boost::unique_lock<rwmutex>
writeLock; 


rwmutex  _rwmutex; 

void readOnly() 

... 
{ // 临界区 
    readLock(_rwmutex) rdlock; 
    ... 
     do something 
    ... 

... 


void writeOnly() 

... 
{ // 临界区 
    writeLock(_rwmutex) wlock; 
    ... 
     do something 
    ... 

... 


对同一个rwmutex, 线程可以同时有多个readLock,这些readLock会阻塞任意一个企图获得writeLockd的线程,直到所有的readLock对象都析够。如果writeLock首先获得了rwmutex,那么他会阻塞任意一个企图在该rwmutex上获得readLock或者writeLock的线程。 

实现互斥锁更容易一点。 
只需要typedef boost::uniq_lock<boost::mutex>  exclusiveLock; 

  boost::mutex _mutex; 

  void exclusiveFoo() 
  { 
      ... 
      { //临界区 
         exclusiveLock(_mutex) exLock; 
         do something... 
      } 
      ... 
     
  } 

除此之外,boost也提供了递归锁的实现, 这里并不对其进行描述。 

抱歉!评论已关闭.