封装Thread的两种方法 via C++ in Linux
方法一: 代理线程函数(proxyThreadFunc)作为类的静态成员函数, 回调函数指针作为类的私有成员变量
方法二: 代理线程函数(proxyThreadFunc)作为全局函数, 回调函数指针作为自定义结构体的成员
Noncopyable.h:
1 #ifndef _Noncopyable_H_ 2 #define _Noncopyable_H_ 3 4 class Noncopyable 5 { 6 public: 7 Noncopyable(){} 8 ~Noncopyable(){} 9 10 private: 11 Noncopyable(const Noncopyable & a){} 12 void operator=(const Noncopyable & a){} 13 }; 14 15 #endif
Thread.h:
1 #ifndef _Thread_H_ 2 #define _Thread_H_ 3 4 #include "Noncopyable.h" 5 #include <functional> 6 #include <pthread.h> 7 8 /*==================== 9 ====================*/ 10 11 class Thread : public Noncopyable 12 { 13 public: 14 typedef std::function<void ()> ThreadFunc; 15 Thread(ThreadFunc func) 16 :thread_id(0), running_status(-1), callback_func(func) 17 {} 18 virtual ~Thread() 19 { 20 if(!running_status) 21 pthread_detach(thread_id); 22 } 23 24 virtual void start() = 0; 25 virtual void join() = 0; 26 27 protected: 28 pthread_t thread_id; 29 int running_status; 30 ThreadFunc callback_func; 31 }; 32 33 /*==================== 34 ====================*/ 35 36 class ThreadStruct : public Thread 37 { 38 public: 39 ThreadStruct(ThreadFunc func) 40 :Thread(func) 41 {} 42 ~ThreadStruct(){} 43 44 virtual void start() override; 45 virtual void join() override; 46 }; 47 48 /*==================== 49 ====================*/ 50 51 class ThreadStatic : public Thread 52 { 53 public: 54 ThreadStatic(ThreadFunc func) 55 :Thread(func) 56 {} 57 ~ThreadStatic(){} 58 59 virtual void start() override; 60 virtual void join() override; 61 62 private: 63 static void * proxyThreadFunc(void *); 64 }; 65 66 #endif
Thread.cpp:
1 #include "Thread.h" 2 3 /*==================== 4 ====================*/ 5 6 struct ThreadData 7 { 8 typedef Thread::ThreadFunc ThreadFunc; 9 ThreadFunc cbfunc; 10 11 ThreadData(ThreadFunc func) 12 :cbfunc(func) 13 {} 14 15 void runThread() 16 { 17 cbfunc(); 18 } 19 }; 20 21 void * proxyThreadFunc(void * arg) 22 { 23 ThreadData * pd = NULL; 24 pd = static_cast<ThreadData *>(arg); 25 pd->runThread(); 26 delete pd; 27 return NULL; 28 } 29 30 void ThreadStruct::start() 31 { 32 ThreadData * td = NULL; 33 td = new ThreadData(callback_func); 34 if(pthread_create(&thread_id, NULL, proxyThreadFunc, td) < 0) 35 delete td; 36 } 37 38 void ThreadStruct::join() 39 { 40 pthread_join(thread_id, NULL); 41 } 42 43 /*==================== 44 ====================*/ 45 46 void * ThreadStatic::proxyThreadFunc(void * arg) 47 { 48 ThreadStatic * pd = NULL; 49 pd = static_cast<ThreadStatic *>(arg); 50 pd->callback_func(); 51 return NULL; 52 } 53 54 void ThreadStatic::start() 55 { 56 pthread_create(&thread_id, NULL, proxyThreadFunc, this); 57 } 58 59 void ThreadStatic::join() 60 { 61 pthread_join(thread_id, NULL); 62 }
ThreadMain.cpp:
1 #include "Thread.h" 2 3 #include <iostream> 4 #include <stdlib.h> 5 #include <sys/socket.h> 6 #include <unistd.h> 7 8 using namespace std; 9 10 class Test 11 { 12 public: 13 void foo() 14 { 15 cout << "foo()" << endl; 16 } 17 18 void bar(int i) 19 { 20 cout << "bar(" << i << ")" << endl; 21 } 22 }; 23 24 /*==================== 25 ====================*/ 26 27 class TestThread 28 { 29 public: 30 TestThread() 31 :cnt(0), pThread(NULL) 32 {} 33 34 void threadFunc() 35 { 36 while(cnt < 5) 37 { 38 sleep(1); 39 cout << "cnt = " << ++cnt << endl; 40 } 41 } 42 43 void start() 44 { 45 pThread->start(); 46 } 47 48 void join() 49 { 50 pThread->join(); 51 } 52 53 void attach(Thread * th) 54 { 55 pThread = th; 56 } 57 58 private: 59 int cnt; 60 Thread * pThread; //类的组合 61 }; 62 63 /*==================== 64 ====================*/ 65 66 int main() 67 { 68 Thread * p1, * p2; 69 TestThread tt; 70 tt.attach(new ThreadStatic(bind(&TestThread::threadFunc, &tt))); 71 Test test; 72 p1 = new ThreadStruct(bind(&Test::foo, &test)); 73 p2 = new ThreadStatic(bind(&Test::bar, &test, 10)); 74 75 tt.start(); 76 p1->start(); 77 p2->start(); 78 tt.join(); 79 p1->join(); 80 p2->join(); 81 delete p1; 82 delete p2; 83 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。