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

  

原文链接: https://www.cnblogs.com/cthon/p/9265514.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++之MutexLock和MutexLockGuard封装

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/277029

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午2:14
下一篇 2023年2月15日 上午2:14

相关推荐