leveldb 之 锁的封装

多线程程序中经常会用到加锁,但是程序中各种return 很可能导致锁未被释放,所通常的做法是将锁进行相应的封装以方便使用。封装方法和使用方法也都差不多,所以也就不再赘述,我们直接看下leveldb中的封装形式就行了。

//lock.h
#ifndef GROUG_COMPUTE_LOCK_H
#define GROUG_COMPUTE_LOCK_H
#include<pthread.h>
#include<sys/types.h>
#include<string>
#include<string.h>
//#include<util.h>
namespace group_compute{
class Mutex{
    private:
        pthread_mutex_t *_mu;
    public:
        Mutex();
        ~Mutex();
        void lock();
        void unlock();
        static void  pthread_call(const std::string label, int result);
};


void  Mutex::pthread_call(const std::string label, int result){
    if (result != 0){
        char *error_msg = NULL;
        error_msg = strerror(result);
        std::string str(error_msg);
    //    FATAL("pthread %s:%s", label.c_str(), str.c_str());
        abort(); 
    }
}
Mutex::Mutex(){
    pthread_call("init lock", pthread_mutex_init(_mu, NULL));
}
Mutex::~Mutex(){
    pthread_call("destroy lock", pthread_mutex_destroy(_mu));
}


void Mutex::lock(){
    pthread_call("lock", pthread_mutex_lock(_mu));
}
void Mutex::unlock(){
    pthread_call("unlock", pthread_mutex_unlock(_mu));
}
class MutexLock {
    private:
        Mutex *_mu;
    public:
        explicit MutexLock(Mutex *mu){
            this->_mu = mu;
            this->_mu->lock();
        }
        ~MutexLock(){
            this->_mu->unlock();
        }
}; // end MutexLock
} //namespace
#endif

//main.cpp
#include"lock.h"
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
group_compute::Mutex mu;
void test( void *args){
    group_compute::MutexLock mulock(&mu);
    printf("%s","hello");
}


int main(){
    test(NULL);
}


//Makefile

CC=gcc
CXX=g++
CXXFLAGS=-g \
-Wall \
-pipe \
-W \
-fPIC 
CCFLAGS=-g \
-Wall \
-pipe \
-W \
-fPIC
INCPATH = -I ./ \
 -I ./include \


lock:main.o
$(CXX) $(CXXFLAGS) main.o -o lock 
main.o:main.cpp lock.h
$(CXX) $(CXXFLAGS) $(INCPATH) -c main.cpp -o main.o 
.PHONY:clean 
clean:
rm -r main.o



注意:上述方法在简单环境下没有问题但是在文件较多时可能(应该是肯定会出现 multiple definition of XXX情况分析 链接问题)。原因是多个文件在同时引用方法的时候编译生成.o文件的时候一般不会有太大问题,但是在链接的时候由于多问文件中出现相同的方法定义所以就会出现在上述问题。解决方法也很简单讲定义和声明分开就行了。但是内联方法除过。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值