多线程下,常常会使用互斥锁或者读写锁来确保临界区的正确使用。
pthread_mutex_lock(&mutex);
//using critical section
pthread_mutex_unlock(&mutex);
如果在使用临界区期间发生异常返回,导致锁没有释放。为了防止这种现象发生,我们通常要在每个return之前都要释放锁,增加代码量、影响美观,而且有忘记的隐患。期望一种能够在不使用时自动释放的锁,这就让我们想到类的自动析构。
#include <phtread.h>
class MutexLock {
public:
MutexLock(pthread_mutex_t* ptr) {
mutex_ptr = ptr;
pthread_mutex_lock(mutex_ptr);
}
~MutexLock()
{
pthread_mutex_unlock(ptr);
}
private:
pthread_mutex_t* ptr;
};
如此类似的可以封装读写锁。使用的时候只需构造改封装类即可,在使用的时候,可以尽量减小锁的作用域。
pthread_mutex_t mutex;
//do something
{
MutexLock lock(&mutex);
//using critical section
}
//do something