6.8 扩展线程接口类(1)
线程接口类是在第4章引入的。接口类的作用就像包装器,使得某些事物显得同正常的情况不同。接口类提供的新的接口是为了使得类更易用、功能性更强、更安全或语义上更加正确。在本章中,我们已经介绍了很多用于管理线程的pthread函数,包括线程属性对象的创建和使用。thread_object类是一个简单的框架类。它的目的是封装pthread线程接口并提供面向对象的语义和组件,使得您可以更加容易地实现在SDLC中产生的模型。现在我们将对thread_object类进行扩展,封装线程属性对象的一些功能。程序清单6-2显示了新的thread_object类和user_thread类的声明。
程序清单6-2
- //Listing 6-2 Declaration of the new thread_object and user_thread.
-
- 1 #ifndef __THREAD_OBJECT_H
- 2 #define __THREAD_OBJECT_H
- 3
- 4 using namespace std;
- 5 #include <iostream>
- 6 #include <pthread.h>
- 7 #include <string>
- 8
- 9 class thread_object{
- 10 pthread_t Tid;
- 11
- 12 protected:
- 13 virtual void do_something(void) = 0;
- 14 pthread_attr_t SchedAttr;
- 15 struct sched_param SchedParam;
- 16 string Name;
- 17 int NewPolicy;
- 18 int NewState;
- 19 int NewScope;
- 20 public:
- 21 thread_object(void);
- 22 ~thread_object(void);
- 23 void setPriority(int Priority);
- 24 void setSchedPolicy(int Policy);
- 25 void setContentionScope(int Scope);
- 26 void setDetached(void);
- 27 void setJoinable(void);
- 28
- 29 void name(string X);
- 30 void run(void);
- 31 void join(void);
- 32 friend void *thread(void *X);
- 33 };
- 34
- 35
- 36 class filter_thread : public thread_object{
- 37 protected:
- 38 void do_something(void);
- 39 public:
- 40 filter_thread(void);
- 41 ~filter_thread(void);
- 42 };
- 43
- 44 #endif
- 45
- 46
对于thread_object,我们加入了设置如下内容的方法:
调度策略
优先级
状态
竞争范围
我们定义了filter_thread类,其中定义了do_something( )方法,而不是在user_thread中定义该方法。这个类在下一章介绍同步时会使用到。
程序清单6-3是新的thread_object类的定义。
程序清单6-3
- //Listing 6-3 A definition of the new thread_object class.
-
- 1 #include "thread_object.h"
- 2
- 3 thread_object::thread_object(void)
- 4 {
- 5 pthread_attr_init(&SchedAttr);
- 6 pthread_attr_setinheritsched(&SchedAttr,PTHREAD_EXPLICIT_SCHED);
- 7 NewState = PTHREAD_CREATE_JOINABLE;
- 8 NewScope = PTHREAD_SCOPE_PROCESS;
- 9 NewPolicy = SCHED_OTHER;
- 10 }
- 11
- 12 thread_object::~thread_object(void)
- 13 {
- 14
- 15 }
- 16
- 17 void thread_object::join(void)
- 18 {
- 19 if(NewState == PTHREAD_CREATE_JOINABLE){
- 20 pthread_join(Tid,NULL);
- 21 }
- 22 }
- 23
- 24 void thread_object::setPriority(int Priority)
- 25 {
- 26 int Policy;
- 27 struct sched_param Param;
- 28
- 29 Param.sched_priority = Priority;
- 30 pthread_attr_setschedparam(&SchedAttr,&Param);
- 31 }
- 32
- 33
- 34 void thread_object::setSchedPolicy(int Policy)
- 35 {
- 36 if(Policy == 1){
- 37 pthread_attr_setschedpolicy(&SchedAttr,SCHED_RR);
- 38 pthread_attr_getschedpolicy(&SchedAttr,&NewPolicy);
- 39 }
- 40
- 41 if(Policy == 2){
- 42 pthread_attr_setschedpolicy(&SchedAttr,SCHED_FIFO);
- 43 pthread_attr_getschedpolicy(&SchedAttr,&NewPolicy);
- 44 }
- 45 }
- 46
- 47
- 48 void thread_object::setContentionScope(int Scope)
- 49 {
- 50 if(Scope == 1){
- 51 pthread_attr_setscope(&SchedAttr,PTHREAD_SCOPE_SYSTEM);
- 52 pthread_attr_getscope(&SchedAttr,&NewScope);
- 53 }
- 54
- 55 if(Scope == 2){
- 56 pthread_attr_setscope(&SchedAttr,PTHREAD_SCOPE_PROCESS);
- 57 pthread_attr_getscope(&SchedAttr,&NewScope);
- 58 }
- 59 }
- 60
- 61
- 62 void thread_object::setDetached(void)
- 63 {
- 64 pthread_attr_setdetachstate(&SchedAttr,PTHREAD_CREATE_DETACHED);
- 65 pthread_attr_getdetachstate(&SchedAttr,&NewState);
- 66
- 67 }
- 68
- 69 void thread_object::setJoinable(void)
- 70 {
- 71 pthread_attr_setdetachstate(&SchedAttr,PTHREAD_CREATE_JOINABLE);
- 72 pthread_attr_getdetachstate(&SchedAttr,&NewState);
- 73 }
- 74
- 75
- 76 void thread_object::run(void)
- 77 {
- 78 pthread_create(&Tid,&SchedAttr,thread,this);
- 79 }
- 80
- 81
- 82 void thread_object::name(string X)
- 83 {
- 84 Name = X;
- 85 }
- 86
- 87
- 88 void * thread (void * X)
- 89 {
- 90 thread_object *Thread;
- 91 Thread = static_cast<thread_object *>(X);
- 92 Thread->do_something();
- 93 return(NULL);
- 94 }