首页UC › linux C++ 面向对象线程类封装

linux C++ 面向对象线程类封装

1.封装遇到的问题

将pthread线程封装为抽象类,这样用户在使用线程时,只需要继承一下这个抽象类,并实现相应的接口就可以了。这样做的好处是用户可以将注意力集中在线程所要执行的逻辑上,而不需要关注创建线程、销毁线程等细节问题上。

我们抽象类的名称为Thread,其中有一个成员函数run,该函数为的声明形式为:

void run() = 0;

即将该成员函数声明为纯虚函数,用户继承此类必须要实现此成员函数。Thread中还有另外一个成员函数start,该函数的声明形式为:

void start();

用户在子类中调用start方法,将启动线程,并在线程中执行run函数。

最常想到的方法就是在start方法中使用pthread_create创建一个线程,并调用run函数。如下面这样的实现:

这样编译肯定是不能通过的,这是因为pthread_create要求的线程例程的接口形式为:

void *(*thread_routin)(void *args);

而上面代码中提供的线程例程的接口形式为:

void Thread::run()

显然不符合要求的接口。

为了能够在start中调用run函数,我们不得不采用一种迂回的方式。下面提供两种方法:一种是使用静态成员函数,另外一种是使用友元函数。

静态成员函数的作用域是全局的,而不仅仅局限于某个函数中。静态成员函数的实现方法和C语言中的普通函数类似,因此静态函数没有this指针,静态函数只能操作静态成员变量。之所以将静态函数封装到类中,在很大程度上也只是为了满足面向对象的特性之一—–封装性。

2.使用静态函数

需要特别注意的是mian函数中使用pthread_create的执行例程为MyThread类中的线程代理函数thread_proxy_func

Thread.cpp

main.cpp

3.使用友元函数

友元函数的作用和静态函数相同,都起到一个代理的作用。需要将对象的指针作为参数传递给这个友元函数,然后在友元函数中调用run函数。代码如下,

由三个文件构成:Thread.h(类的声明文件),Thread.cpp(类的实现文件),main.cpp(测试文件):

Thread.h

Thread.cpp

main.cpp

运行结果
20140119131904687
makefile参考

发表评论