码迷,mamicode.com
首页 > 编程语言 > 详细

C++之MutexLock和MutexLockGuard封装

时间:2020-10-06 20:12:15      阅读:20      评论:0      收藏:0      [点我收藏+]

标签:ati   fine   detach   return   head   mes   protect   name   define   

noncopyable.h

#ifndef __WD_NONCOPYABLE_H__
#define __WD_NONCOPYABLE_H__
 
namespace wd
{
 
class Noncopyable
{
protected:
    Noncopyable(){}
    ~Noncopyable(){}
private:
    Noncopyable(const Noncopyable&);
    Noncopyable & operator=(const Noncopyable &);
};
 
}//end of namespace wd
 
#endif

thread.h

#ifndef __WD_MUTEXLOCK_H__
#define __WD_MUTEXLOCK_H__
<br>#include "Noncopyable.h"
#include <pthread.h>
namespace wd
{
 
class MutexLock<br>:public Noncopyable //表达语义
{
public:
    MutexLock()
    {   pthread_mutex_init(&_mutex, NULL);  }
 
    ~MutexLock()
    {   pthread_mutex_destroy(&_mutex); }
 
    void lock()
    {   pthread_mutex_lock(&_mutex);}
 
    void unlock()
    {   pthread_mutex_unlock(&_mutex);}
 
    pthread_mutex_t * getMutexLockPtr()
    {   return &_mutex; }
 
private:
    pthread_mutex_t _mutex;
};
 
//RAII
class MutexLockGuard
{
public:
    MutexLockGuard(MutexLock & mutex)
    : _mutex(mutex)
    {   _mutex.lock();  }
 
    ~MutexLockGuard()
    {   _mutex.unlock();    }
 
private:
    MutexLock & _mutex;
};
 
}//end of namespace wd
 
 
#endif

thread.cc

#include "Thread.h"
#include <iostream>
 
using std::cout;
using std::endl;
using namespace wd;
 
 
Thread::Thread()
: _pthid(0)
, _isRunning(false)
{}
 
 
void Thread::start()
{
    pthread_create(&_pthid, NULL, threadFunc, this);
    _isRunning = true;
}
 
void * Thread::threadFunc(void * arg)
{
    Thread * pthread = static_cast<Thread*>(arg);
    if(pthread)
        pthread->run();// 执行任务
 
    return NULL;
}
 
void Thread::join()
{
    pthread_join(_pthid, NULL);
    _isRunning = false;
}
 
Thread::~Thread()
{
    if(_isRunning) 
    {
        pthread_detach(_pthid);// 将运行的线程交给系统进行托管
        _isRunning = false;
    }
}

test


#include "Thread.h"
 
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::unique_ptr;
 
class MyThread
: public wd::Thread
{
    void run()
    {
        ::srand(::time(NULL));
        int cnt = 10;
        while(cnt--) {
            int number = ::rand() % 100;
            cout << ">> Thread "<< pthread_self() << " get a number : " << number << endl;
            ::sleep(1);
        }
    }
};
  
int main(void)
{
    cout << "MainThread: " << pthread_self() << endl;
    unique_ptr<wd::Thread> myThread(new MyThread());//线程对象在主线程
    myThread->start();
    myThread->join();
 
    return 0;
}

C++之MutexLock和MutexLockGuard封装

标签:ati   fine   detach   return   head   mes   protect   name   define   

原文地址:https://www.cnblogs.com/ims-/p/13763612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!