首先,BOOST中有4种有关互斥量得概念。
1.LOCKABLE :仅支持排它型所有权
2.TIMEDLOCKABLE:支持带超时的排它型所有权
3.SHAREDLOCKABLE: 支持带超时的排他型所有权和共享型所有权(读写锁)
4.UPGRADELOCKABLE:
支持带超时的排他型所有权和共享型所有权,以及共享型所有权升级为排他型所有权(升级过程阻塞)(也支持降级)
可以看到2强化自1,3强化自2.4强化自3,支持某一概念则一定支持其强化自的概念。
boost::mutex 实现了LOCKABLE概念 (boost::recursive_mutex 是其递归锁的版本)
boost::timed_mutex 实现了TIMEDLOCKABLE概念
(boost::recursive_timed_mutex 是其递归锁的版本)
boost::shared_mutex实现了SHAREDLOCKABLE概念
boost::shared_mutex同样实现了UPGRADELOCKABLE概念
出于提供RAII操作风格和安全等其他一些原因BOOST不希望用户直接调用各种MUTEX类型中的相关接口,而是通过它提供的一些LOCK_TYPE来帮助我们调用。
主要的LOCK_TYPE包括:
boost::unique_lock<LOCKABLE> 针对支持LOCKABLE概念的类型(上述4中MUTEX类型都支持LOCKABLE概念)。以RAII的方式调用该类的lock()
(调用成功后排它的独占该互斥量)和 unlock() 方法。
boost::shared_lock<SHAREDLOCKABLE>针对支持SHAREDLOCKABLE概念的类型,boost::shared_mutex实现了该概念,注意,支持SHAREDLOCKABLE概念的类既支持排他的独占(写锁,通过调用lock unlock系列函数),也支持共享的方式占用(读锁,通过调用lock_shared系列),
shared_lock默认调用
lock_shared系列。
最主要最常用的就是上面这两个LOCK类型,分别代表独占方式和共享方式,其他的就不一一分析了。
下面是个从 http://hi.baidu.com/jrckkyy/blog/item/d7ccb508dfba2e3ce8248817.html 此处找到的例子
1.LOCKABLE :仅支持排它型所有权
2.TIMEDLOCKABLE:支持带超时的排它型所有权
3.SHAREDLOCKABLE: 支持带超时的排他型所有权和共享型所有权(读写锁)
4.UPGRADELOCKABLE:
可以看到2强化自1,3强化自2.4强化自3,支持某一概念则一定支持其强化自的概念。
boost::mutex 实现了LOCKABLE概念 (boost::recursive_mutex 是其递归锁的版本)
boost::timed_mutex 实现了TIMEDLOCKABLE概念
boost::shared_mutex实现了SHAREDLOCKABLE概念
boost::shared_mutex同样实现了UPGRADELOCKABLE概念
出于提供RAII操作风格和安全等其他一些原因BOOST不希望用户直接调用各种MUTEX类型中的相关接口,而是通过它提供的一些LOCK_TYPE来帮助我们调用。
主要的LOCK_TYPE包括:
boost::unique_lock<LOCKABLE> 针对支持LOCKABLE概念的类型(上述4中MUTEX类型都支持LOCKABLE概念)。以RAII的方式调用该类的lock()
boost::shared_lock<SHAREDLOCKABLE>针对支持SHAREDLOCKABLE概念的类型,boost::shared_mutex实现了该概念,注意,支持SHAREDLOCKABLE概念的类既支持排他的独占(写锁,通过调用lock unlock系列函数),也支持共享的方式占用(读锁,通过调用lock_shared系列),
最主要最常用的就是上面这两个LOCK类型,分别代表独占方式和共享方式,其他的就不一一分析了。
下面是个从 http://hi.baidu.com/jrckkyy/blog/item/d7ccb508dfba2e3ce8248817.html 此处找到的例子
typedef
boost::shared_mutex rwmutex;
typedef boost::shared_lock<rwmutex> readLock;
typedef boost::uniq_lock<rwmutex> writeLock;
rwmutex _rwmutex;
void readOnly()
{
...
{ // 临界区
readLock rdlock
(_rwmutex);
...
do something
...
}
...
}
void writeOnly()
{
...
{ // 临界区
writeLock wlock(
_rwmutex);
...
do something
...
}
...
}
typedef boost::shared_lock<rwmutex> readLock;
typedef boost::uniq_lock<rwmutex> writeLock;
rwmutex _rwmutex;
void readOnly()
{
...
{ // 临界区
readLock rdlock
...
do something
...
}
...
}
void writeOnly()
{
...
{ // 临界区
writeLock wlock(
...
do something
...
}
...
}
来源:oschina
链接:https://my.oschina.net/u/90679/blog/109043