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