http://www.boost.org/doc/libs/1_46_1/doc/html/thread/synchronization.html
mutex 是mutual exclusion(互斥), 是一个概念 , A mutex object facilitates protection against data races and allows thread-safe synchronization of data between threads, 这句话描述了mutex object的作用, 在这篇文档中, 定义了几4种 mutex concept, 每种concept都有对应的几个接口来阐述这种concept. 4种concept分别是lockable, timedLockablek, sharedLocable, upgradeLocable,每种concept所应该拥用的接口(功能)见文档中的定义. mutex object从概念上讲是一种资源,像内存一样
boost::thead库中定义了几个类, 其中每个都实现了一个或几个相关的concept, 现在主要提到 class mutex ; class shared_mutex, mutex实现了lockable, 而shared_mutex四种concept都实现了, 因此, shared_mutex应该是从代码上来说复杂很多
在boost::thread中还定义一系列LockTypes, 都是类模板,而模板中的类型参数指的是 代表互斥量 的类型, 这当中最基本和简单的是lock_guard, 在构造时调用mutex.lock(), 析构时调用mutex.unlock(), 这实现了简单的 RAII-style locking of a Lockable object (关于RAII (Resource Acquisition is Initialization), 是一种利用对象生命周期来控制程序资源的简单技术) ,lock_guard除constructor, destructor外并没有提供其它的接口让我们使用
shared_lock, unique_lock 都提供了lock(), unlock(), bool owns_lock()三种方法, 在unique_lock中, lock(),unlock()分别调用mutex->lock() , mutex->unlock(), 在shared_lock中lock(), unlock()分别调用mutex->lock_shared(), mutex->unlock_shared(), owns_lock返回是否拥有mutex当前 当然在构造函数若要lock()都是调用模板类自己的lock(), 而且的构造函数中可以不调lock(),因此可以推迟m->lock().
我们工程中用shared_lock, unique_lock定义自己用的读写锁
1 typedef shared_lock<shared_mutex> ReadLock; 2 typedef unique_lock<shared_mutex> WriteLock;
对于unique_lock还有mutex()和release()方法, mutex()返回内部存的Mutex*, release()还不知道在实际code中可以有什么用, release()不调用m->unlock(),但是把内部的is_locked标记为false, 并且 m = null, 然后返回之前的Mutex*.