多线程程序中经常会用到加锁,但是程序中各种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文件的时候一般不会有太大问题,但是在链接的时候由于多问文件中出现相同的方法定义所以就会出现在上述问题。解决方法也很简单讲定义和声明分开就行了。但是内联方法除过。