1. 程式人生 > >C++之MutexLock和MutexLockGuard封裝

C++之MutexLock和MutexLockGuard封裝

執行 div unistd.h sta lock ptr cas turn sleep

thread.h

#ifndef __WD_MUTEXLOCK_H__
#define __WD_MUTEXLOCK_H__

#include <pthread.h> 
namespace wd
{

class MutexLock
{
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;
}

  

C++之MutexLock和MutexLockGuard封裝