使用C++封装互斥锁的实践

来源:互联网 发布:手机oa软件 编辑:程序博客网 时间:2024/06/06 00:33

使用C++封装互斥锁的实践


代码如下所示:

/***********************/ //  完成互斥锁类的封装C++ // @file    mutexLock.cc /***********************/#include <iostream>#include <pthread.h>#include <unistd.h>#include <assert.h>using std::cout;using std::endl;/*互斥锁类的封装*/class MutexLock{private:    pthread_mutex_t _mutex;//互斥量    int _count;    pthread_t _owner;public:    MutexLock();    ~MutexLock();    void lock();    void unlock();    pthread_mutex_t getMutex();};//构造函数MutexLock::MutexLock(): _count(0), _owner(0){    cout <<"构造函数被调用" << endl;    pthread_mutex_init(&_mutex, NULL);//初始化互斥量}//析构MutexLock::~MutexLock(){    pthread_mutex_destroy(&_mutex);}//加锁成员函数void MutexLock::lock(){    pthread_t self = pthread_self();//self为当前线程id    if(_owner != self)    {       pthread_mutex_lock(&_mutex);       _owner = self;    }    _count++;    cout << "加锁" << endl;}//解锁成员函数void MutexLock::unlock(){    assert(pthread_self() == _owner);    if(_count != 0)    {       _owner = 0;       pthread_mutex_unlock(&_mutex);    }    cout << "解锁" << endl;}//getMutexpthread_mutex_t MutexLock::getMutex(){    return _mutex;}/*----以上为互斥锁封装部分----*//*----以下为实践测试部分----*///创建互斥锁对象myLockMutexLock myLock;//线程函数void* threadFunc(void* str){    char *msg = (char*)str;    int i;    MutexLock  lock(myLock);    //加锁    myLock.lock();    for(i = 0; i<5; i++)    {       cout << msg <<endl;       sleep(1);    }    //解锁    myLock.unlock();    return NULL;}int main(void){    pthread_t tid_a, tid_b;    char* str1 = "thread a";    char* str2 = "thread b";    pthread_create(&tid_a, NULL, threadFunc, str1);    pthread_create(&tid_b, NULL, threadFunc, str2);    pthread_join(tid_a, NULL);    pthread_join(tid_b, NULL);    return 0;}

执行结果如下:

这里写图片描述

注释掉加锁的代码部分,如下:

这里写图片描述

重新编译执行结果为:

这里写图片描述

对比可知,说明互斥锁起作用了。

0 0