锁的封装一般考虑两个问题:
- 初始化和销毁
- 加锁和解锁
因为锁不允许拷贝和赋值语义,因此继承前面的noncopyable类。
参考 https://blog.csdn.net/littleflypig/article/details/88799617
封装
首先对mutex资源进行封装,这个类代表锁这个资源:
- 定义一个宏来对pthread函数返回值进行检查,因此pthread函数一般返回0代表成功,所以用CHECK(!exp)进行检查。
- 宏中的__FILE__和__LINE__都是GCC编译器预定义宏,一般可以用这些宏进行调试输出信息。
-还有一点注意加锁和解锁时成员变量islocking的修改顺序
#define CHECK(exp)\
if(!exp) \
{ \
fprintf(stderr,"file:%s,line:%d Exp:[" #exp "] not return 0\n",__FILE__,__LINE__);abort();\
}
class MutexLock:public noncopyable{
public:
MutexLock();
~MutexLock();
void lock();
void unlock();
bool islocking(){
return islocking_;
}
pthread_mutex_t* getMutexPtr(){
return &mutex_;
}
private:
void restoreMutexStatus() {
islocking_ = true;
}