最近看了一个Thread类(忘记在哪里看的了),感觉不错。
创建线程时线程对应的函数必须是类的静态成员,由于静态成员无法访问类的非静态成员,我从前都是把对象的指针作为参数传递给线程函数来避免这个问题,但是在逻辑上线程函数还需要访问对象的私有成员,总是感觉代码很不优雅。这个Thread类同java中的Thread类在用法上比较类似,使用一种比较优雅的方法避免了上面的问题。使用时只要从Thread派生一个子类并实现线程运行的函数 void run() 就可以了。还是看代码吧: 先把使用方法贴上来:
C++语言: Codee#880
01 #include<iostream>
02 03 #include "Thread.h" 04 05 class MyThreadClass: public Thread 06 { 07 private: 08 int a; 09 public: 10 MyThreadClass( ){ 11 a = 0; 12 } 13 ~MyThreadClass(){ 14 } 15 virtual void run(); 16 }; 17 18 void Receiver::run(){ 19 a++; 20 std::cout<<a<<std::endl; 21 } 22 23 int main(int argc, char * argv[]) 24 { 25 MyThreadClass myThread; 26 myThread.start();//创建了一个线程,运行函数run() 27 myThread.join();//等待线程结束 28 return 0; 29 }
C++语言: Thread.h
01 #ifndef COMMUNITCATE_H
02 #define COMMUNITCATE_H 03 04 05 06 #include "pthread.h" 07 08 09 class Thread 10 { 11 protected: 12 pthread_t _tid; 13 static void* run0(void* opt); 14 void* run1();//如果类中有保存线程状态的变量,可以在这个函数中可以进行更改操作 15 public: 16 Thread(); 17 ~Thread(); 18 /** 19 * 创建线程,线程函数是 run0 20 * 21 * @return 成功返回 ture 否则返回 false 22 */ 23 bool start(); 24 /** 25 * join this thread 26 * 27 */ 28 void join(); 29 virtual void run(){ 30 31 } 32 }; 33 34 35 #endif
C++语言: Thread.cpp
01 #include "Thread.h"
02 03 Thread::Thread(){ 04 05 } 06 07 Thread::~Thread(){ 08 09 } 10 11 12 13 void* Thread::run0(void* opt) 14 { 15 Thread* p = (Thread*) opt; 16 p->run1(); 17 return p; 18 } 19 20 void* Thread::run1() 21 { 22 _tid = pthread_self(); 23 run(); 24 _tid = 0; 25 pthread_exit(NULL); 26 } 27 28 bool Thread::start() 29 { 30 return pthread_create(&_tid, NULL, run0, this) == 0; 31 } 32 33 void Thread::join() 34 { 35 if( _tid > 0 ){ 36 pthread_join(_tid, NULL); 37 } 38 } |