设为首页 加入收藏

TOP

6.8 扩展线程接口类(1)
2013-10-07 13:00:19 来源: 作者: 【 】 浏览:56
Tags:6.8 扩展 线程 接口

6.8  扩展线程接口类(1)

线程接口类是在第4章引入的。接口类的作用就像包装器,使得某些事物显得同正常的情况不同。接口类提供的新的接口是为了使得类更易用、功能性更强、更安全或语义上更加正确。在本章中,我们已经介绍了很多用于管理线程的pthread函数,包括线程属性对象的创建和使用。thread_object类是一个简单的框架类。它的目的是封装pthread线程接口并提供面向对象的语义和组件,使得您可以更加容易地实现在SDLC中产生的模型。现在我们将对thread_object类进行扩展,封装线程属性对象的一些功能。程序清单6-2显示了新的thread_object类和user_thread类的声明。

程序清单6-2

  1. //Listing 6-2 Declaration of the new thread_object and user_thread.  
  2.                 
  3. 1   #ifndef __THREAD_OBJECT_H  
  4. 2   #define __THREAD_OBJECT_H  
  5. 3  
  6. 4   using namespace std;  
  7. 5   #include <iostream> 
  8. 6   #include <pthread.h> 
  9. 7   #include <string> 
  10. 8  
  11. 9   class thread_object{  
  12. 10        pthread_t Tid;  
  13. 11  
  14. 12  protected:  
  15. 13       virtual void do_something(void) = 0;  
  16. 14       pthread_attr_t SchedAttr;  
  17. 15       struct sched_param SchedParam;  
  18. 16       string Name;  
  19. 17       int NewPolicy;  
  20. 18       int NewState;  
  21. 19       int NewScope;  
  22. 20  public:  
  23. 21       thread_object(void);  
  24. 22       ~thread_object(void);  
  25. 23       void setPriority(int Priority);  
  26. 24       void setSchedPolicy(int Policy);  
  27. 25       void setContentionScope(int Scope);  
  28. 26       void setDetached(void);  
  29. 27       void setJoinable(void);  
  30. 28  
  31. 29       void name(string X);  
  32. 30       void run(void);  
  33. 31       void join(void);  
  34. 32       friend void *thread(void *X);  
  35. 33  };  
  36. 34  
  37. 35  
  38. 36  class filter_thread : public thread_object{  
  39. 37  protected:  
  40. 38       void do_something(void);  
  41. 39  public:  
  42. 40       filter_thread(void);  
  43. 41       ~filter_thread(void);  
  44. 42  };  
  45. 43  
  46. 44  #endif  
  47. 45  
  48. 46 

对于thread_object,我们加入了设置如下内容的方法:

调度策略

优先级

状态

竞争范围

我们定义了filter_thread类,其中定义了do_something( )方法,而不是在user_thread中定义该方法。这个类在下一章介绍同步时会使用到。

程序清单6-3是新的thread_object类的定义。

程序清单6-3

  1. //Listing 6-3  A definition of the new thread_object class.  
  2.                 
  3. 1   #include "thread_object.h"  
  4. 2  
  5. 3   thread_object::thread_object(void)  
  6. 4   {  
  7. 5      pthread_attr_init(&SchedAttr);  
  8. 6      pthread_attr_setinheritsched(&SchedAttr,PTHREAD_EXPLICIT_SCHED);  
  9. 7      NewState = PTHREAD_CREATE_JOINABLE;  
  10. 8      NewScope = PTHREAD_SCOPE_PROCESS;  
  11. 9      NewPolicy = SCHED_OTHER;  
  12. 10  }  
  13. 11  
  14. 12  thread_object::~thread_object(void)  
  15. 13  {  
  16. 14  
  17. 15  }  
  18. 16  
  19. 17  void thread_object::join(void)  
  20. 18  {  
  21. 19     if(NewState == PTHREAD_CREATE_JOINABLE){  
  22. 20        pthread_join(Tid,NULL);  
  23. 21     }  
  24. 22  }  
  25. 23  
  26. 24  void thread_object::setPriority(int Priority)  
  27. 25  {  
  28. 26     int Policy;  
  29. 27     struct sched_param Param;  
  30. 28  
  31. 29     Param.sched_priority = Priority;  
  32. 30     pthread_attr_setschedparam(&SchedAttr,&Param);  
  33. 31  }  
  34. 32  
  35. 33  
  36. 34  void thread_object::setSchedPolicy(int Policy)  
  37. 35  {  
  38. 36     if(Policy == 1){  
  39. 37        pthread_attr_setschedpolicy(&SchedAttr,SCHED_RR);  
  40. 38        pthread_attr_getschedpolicy(&SchedAttr,&NewPolicy);  
  41. 39     }  
  42. 40  
  43. 41     if(Policy == 2){  
  44. 42        pthread_attr_setschedpolicy(&SchedAttr,SCHED_FIFO);  
  45. 43        pthread_attr_getschedpolicy(&SchedAttr,&NewPolicy);  
  46. 44     }  
  47. 45  }  
  48. 46  
  49. 47  
  50. 48  void thread_object::setContentionScope(int Scope)  
  51. 49  {  
  52. 50     if(Scope == 1){  
  53. 51        pthread_attr_setscope(&SchedAttr,PTHREAD_SCOPE_SYSTEM);  
  54. 52        pthread_attr_getscope(&SchedAttr,&NewScope);  
  55. 53     }  
  56. 54  
  57. 55     if(Scope == 2){  
  58. 56        pthread_attr_setscope(&SchedAttr,PTHREAD_SCOPE_PROCESS);  
  59. 57        pthread_attr_getscope(&SchedAttr,&NewScope);  
  60. 58     }  
  61. 59  }  
  62. 60  
  63. 61  
  64. 62  void thread_object::setDetached(void)  
  65. 63  {  
  66. 64     pthread_attr_setdetachstate(&SchedAttr,PTHREAD_CREATE_DETACHED);  
  67. 65     pthread_attr_getdetachstate(&SchedAttr,&NewState);  
  68. 66  
  69. 67  }  
  70. 68  
  71. 69  void thread_object::setJoinable(void)  
  72. 70  {  
  73. 71     pthread_attr_setdetachstate(&SchedAttr,PTHREAD_CREATE_JOINABLE);  
  74. 72     pthread_attr_getdetachstate(&SchedAttr,&NewState);  
  75. 73  }  
  76. 74  
  77. 75  
  78. 76  void thread_object::run(void)  
  79. 77  {  
  80. 78     pthread_create(&Tid,&SchedAttr,thread,this);  
  81. 79  }  
  82. 80  
  83. 81  
  84. 82  void thread_object::name(string X)  
  85. 83  {  
  86. 84     Name = X;  
  87. 85  }  
  88. 86  
  89. 87  
  90. 88  void *  thread (void * X)  
  91. 89  {  
  92. 90     thread_object *Thread;  
  93. 91     Thread = static_cast<thread_object *>(X);  
  94. 92     Thread->do_something();  
  95. 93     return(NULL);  
  96. 94  } 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.8 扩展线程接口类(2) 下一篇6.7.6 线程安全和库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: