zoukankan      html  css  js  c++  java
  • C++之MutexLock和MutexLockGuard封装

    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 <pthread.h> 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 <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;
    	}
    }
    

      

    testThread.cc

    #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;
    }
    

      

  • 相关阅读:
    Bootstrap按钮
    Bootstrap标签页
    Identity 使用的命名空间
    bootstrap复选框和单选按钮
    更改Identity用户信息
    SSM配置梳理
    敏捷软件开发 第十三章~第十七章
    敏捷软件开发 第七章、第八章、第九章
    敏捷软件开发 第六章 一次编程实践
    敏捷软件开发 一至五章
  • 原文地址:https://www.cnblogs.com/cthon/p/9265514.html
Copyright © 2011-2022 走看看