C++之MutexLock和MutexLockGuard封装

2021-03-25 18:25

阅读:522

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

目录
  • noncopyable.h
  • thread.h
  • thread.cc
  • test

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__

#include "Noncopyable.h" #include namespace wd { class MutexLock
: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 
 
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(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 
#include 
#include 
#include 
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 " 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


评论


亲,登录后才可以留言!