现在的位置: 首页 > 综合 > 正文

c++的thread类(c++线程简单用法)

2012年08月07日 ⁄ 综合 ⁄ 共 1819字 ⁄ 字号 评论关闭

最近看了一个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 }



下面是Thread类的实现,为了阅读清晰,删减了很多内容

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 }

抱歉!评论已关闭.