Thread
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:11k
源码类别:

并行计算

开发平台:

Visual C++

  1. //
  2. // OpenThreads library, Copyright (C) 2002 - 2003  The Open Thread Group
  3. //
  4. // This library is free software; you can redistribute it and/or
  5. // modify it under the terms of the GNU Lesser General Public
  6. // License as published by the Free Software Foundation; either
  7. // version 2.1 of the License, or (at your option) any later version.
  8. //
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. // Lesser General Public License for more details.
  13. // 
  14. // You should have received a copy of the GNU Lesser General Public
  15. // License along with this library; if not, write to the Free Software
  16. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. //
  18. //
  19. // Thread - C++ Thread class
  20. // ~~~~~~~~
  21. //
  22. #ifndef _OPENTHREADS_THREAD_
  23. #define _OPENTHREADS_THREAD_
  24. #include <sys/types.h>
  25. #include "Exports"
  26. #ifdef _WIN32
  27. // WIN32 @#!^$%#
  28. #ifdef Yield
  29. #undef Yield
  30. #endif
  31. #endif
  32. namespace OpenThreads {
  33. /**
  34.  *  @class Thread
  35.  *  @brief  This class provides an object-oriented thread interface.
  36.  */
  37. class OPENTHREAD_EXPORT_DIRECTIVE Thread {
  38. public:
  39.     /**
  40.      *  Set the concurrency level for a running application.  This method
  41.      *  only has effect if the pthreads thread model is being used, and 
  42.      *  then only when that model is many-to-one (eg. irix).
  43.      *  in other cases it is ignored.  The concurrency level is only a
  44.      *  *hint* as to the number of execution vehicles to use, the actual
  45.      *  implementation may do anything it wants.  Setting the value
  46.      *  to 0 returns things to their default state.
  47.      *
  48.      *  @return previous concurrency level, -1 indicates no-op.
  49.      */
  50.     static int SetConcurrency(int concurrencyLevel);
  51.     /**
  52.      *  Get the concurrency level for a running application.  In this
  53.      *  case, a return code of 0 means that the application is in default
  54.      *  mode.  A return code of -1 means that the application is incapable 
  55.      *  of setting an arbitrary concurrency, because it is a one-to-one
  56.      *  execution model (sprocs, linuxThreads)
  57.      */
  58.     static int GetConcurrency();
  59.     /**
  60.      *  Enumerated Type for thread priority
  61.      */
  62.     enum ThreadPriority {
  63. PRIORITY_MAX,      /**< The maximum possible priority  */
  64. PRIORITY_HIGH,     /**< A high (but not max) setting   */
  65. PRIORITY_NOMINAL,  /**< An average priority            */
  66. PRIORITY_LOW,      /**< A low (but not min) setting    */
  67. PRIORITY_MIN,      /**< The miniumum possible priority */
  68. PRIORITY_DEFAULT   /**< Priority scheduling default    */
  69.     };
  70.     
  71.     /**
  72.      *  Enumerated Type for thread scheduling policy
  73.      */
  74.     enum ThreadPolicy {
  75. SCHEDULE_FIFO,        /**< First in, First out scheduling         */
  76. SCHEDULE_ROUND_ROBIN, /**< Round-robin scheduling (LINUX_DEFAULT) */ 
  77. SCHEDULE_TIME_SHARE,  /**< Time-share scheduling (IRIX DEFAULT)   */
  78. SCHEDULE_DEFAULT      /**< Default scheduling                     */
  79.        
  80.     };
  81.     
  82.     /**
  83.      *  Constructor
  84.      */
  85.     Thread();
  86.     /**
  87.      *  Destructor
  88.      */
  89.     virtual ~Thread();
  90.     /**
  91.      *  Return a pointer to the current running thread
  92.      */
  93.     static Thread *CurrentThread();
  94.     /**
  95.      *  Initialize Threading in a program.  This method must be called before
  96.      *  you can do any threading in a program.
  97.      */ 
  98.     static void Init();
  99.     /**
  100.      *  Yield the processor.  
  101.      *
  102.      *  @note This method operates on the calling process.  And is
  103.      *  equivalent to calling sched_yield().
  104.      *
  105.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  106.      */
  107.     static int Yield();
  108.     /**
  109.      *  This method will return the ThreadPriority of the master process. 
  110.      *  (ie, the one calling the thread->start() methods for the first time)
  111.      *  The method will almost certainly return Thread::PRIORITY_DEFAULT if
  112.      *  Init() has not been called.
  113.      * 
  114.      *  @return the Thread::ThreadPriority of the master thread.
  115.      */
  116.     static ThreadPriority GetMasterPriority() {return s_masterThreadPriority;};
  117.     /**
  118.      *  Get a unique thread id.  This id is monotonically increasing.
  119.      *
  120.      *  @return a unique thread identifier
  121.      */
  122.     int getThreadId();
  123.     /**
  124.      *  Get the thread's process id.  This is the pthread_t or pid_t value
  125.      *  depending on the threading model being used.
  126.      *
  127.      *  @return thread process id.
  128.      */
  129.     int getProcessId();
  130.     /**
  131.      *  Start the thread.  This method will configure the thread, set
  132.      *  it's priority, and spawn it. 
  133.      *
  134.      *  @note if the stack size specified setStackSize is smaller than the 
  135.      *  smallest allowable stack size,  the threads stack size will be set to 
  136.      *  the minimum allowed, and may be retrieved via the getStackSize()
  137.      *
  138.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  139.      */
  140.     int start();
  141.     int startThread();
  142.     /**
  143.      * Test the cancel state of the thread.  If the thread has been canceled
  144.      * this method will cause the thread to exit now.  This method operates
  145.      * on the calling thread.
  146.      *
  147.      * Returns 0 if normal, -1 if called from a thread other that this.
  148.      */ 
  149.     int testCancel();
  150.     /**
  151.      *  Cancel the thread.  Equivalent to SIGKILL.
  152.      *
  153.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  154.      */
  155.     virtual int cancel();
  156.     /**
  157.      *  Set the thread's schedule priority.  This is a complex method.
  158.      *  Beware of thread priorities when using a many-to-many kernel
  159.      *  entity implemenation (such as IRIX pthreads).  If one is not carefull
  160.      *  to manage the thread priorities, a priority inversion deadlock can
  161.      *  easily occur (Although the OpenThreads::Mutex & OpenThreads::Barrier 
  162.      *  constructs have been designed with this senario in mind).  Unless 
  163.      *  you have explicit need to set the schedule pirorites for a given
  164.      *  task, it is best to leave them alone.
  165.      *
  166.      *  @note some implementations (notably LinuxThreads and IRIX Sprocs) 
  167.      *  only alow you to decrease thread priorities dynamically.  Thus,
  168.      *  a lower priority thread will not allow it's priority to be raised
  169.      *  on the fly.  
  170.      *
  171.      *  @note seting the environment variable OUTPUT_THREADLIB_SCHEDULING_INFO
  172.      *  will output scheduling information for each thread to stdout.
  173.      *
  174.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  175.      */
  176.     int setSchedulePriority(ThreadPriority priority);
  177.     /**
  178.      *  Get the thread's schedule priority (if able)
  179.      *
  180.      *  @note seting the environment variable OUTPUT_THREADLIB_SCHEDULING_INFO
  181.      *  will output scheduling information for each thread to stdout.
  182.      *
  183.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  184.      */
  185.     int getSchedulePriority();
  186.     /**
  187.      *  Set the thread's scheduling policy (if able)
  188.      *  
  189.      *  @note On some implementations (notably IRIX Sprocs & LinuxThreads) 
  190.      *  The policy may prohibit the use of SCHEDULE_ROUND_ROBIN and
  191.      *  SCHEDULE_FIFO policies - due to their real-time nature, and 
  192.      *  the danger of deadlocking the machine when used as super-user.  
  193.      *  In such cases, the command is a no-op.
  194.      *
  195.      *  @note seting the environment variable OUTPUT_THREADLIB_SCHEDULING_INFO
  196.      *  will output scheduling information for each thread to stdout.
  197.      *
  198.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  199.      */
  200.     int setSchedulePolicy(ThreadPolicy policy);
  201.     /**
  202.      *  Get the thread's policy (if able)
  203.      *
  204.      *  @note seting the environment variable OUTPUT_THREADLIB_SCHEDULING_INFO
  205.      *  will output scheduling information for each thread to stdout.
  206.      *
  207.      *  @return policy if normal, -1 if errno set, errno code otherwise.
  208.      */
  209.     int getSchedulePolicy();
  210.     /**
  211.      *  Set the thread's desired stack size (in bytes).  
  212.      *  This method is an attribute of the thread and must be called 
  213.      *  *before* the start() method is invoked.
  214.      *
  215.      *  @note a return code of 13 (EACESS) means that the thread stack 
  216.      *  size can no longer be changed. 
  217.      *
  218.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  219.      */
  220.     int setStackSize(size_t size);
  221.     /**
  222.      *  Get the thread's desired stack size.  
  223.      *
  224.      *  @return the thread's stack size.  0 indicates that the stack size
  225.      *   has either not yet been initialized, or not yet been specified by
  226.      *   the application.
  227.      */
  228.     size_t getStackSize();
  229.     /**
  230.      *  Print the thread's scheduling information to stdout.
  231.      */
  232.     void printSchedulingInfo();
  233.     /**
  234.      *  Detach the thread from the calling process.
  235.      *
  236.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  237.      */
  238.     int detach();
  239.     /**
  240.      *  Join the calling process with the thread
  241.      *
  242.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  243.      */
  244.     int join();
  245.     /**
  246.      *  Disable thread cancelation altogether. Thread::cancel() has no effect.
  247.      *
  248.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  249.      */
  250.     int setCancelModeDisable();
  251.     /**
  252.      *  Mark the thread to cancel aysncronously on Thread::cancel().
  253.      *  (May not be available with process-level implementations).
  254.      *
  255.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  256.      */
  257.     int setCancelModeAsynchronous();
  258.     /**
  259.      *  Mark the thread to cancel at the earliest convenience on 
  260.      *  Thread::cancel() (This is the default)
  261.      *
  262.      *  @return 0 if normal, -1 if errno set, errno code otherwise.
  263.      */
  264.     int setCancelModeDeferred();
  265.     /**
  266.      *  Query the thread's running status
  267.      *
  268.      *  @return true if running, false if not.
  269.      */
  270.     bool isRunning();
  271.     /**
  272.      *  Thread's run method.  Must be implemented by derived classes.
  273.      *  This is where the action happens.
  274.      */
  275.     virtual void run() = 0;
  276.     /**
  277.      *  Thread's cancel cleanup routine, called upon cancel(), after the
  278.      *  cancelation has taken place, but before the thread exits completely. 
  279.      *  This method should be used to repair parts of the thread's data
  280.      *  that may have been damaged by a pre-mature cancel.  No-op by default.
  281.      */
  282.     virtual void cancelCleanup() {};
  283. private:
  284.     /**
  285.      *  The Private Actions class is allowed to operate on private data.
  286.      */    
  287.     friend class ThreadPrivateActions;  
  288.      /**
  289.       *  Private copy constructor, to prevent tampering.
  290.       */
  291.     Thread(const Thread &) {};
  292.      
  293.     /**
  294.       *  Private copy assignment, to prevent tampering.
  295.       */
  296.     Thread &operator=(const Thread &) {return *(this);};
  297.      
  298.     /**
  299.      *  Implementation-specific data
  300.      */
  301.     void * _prvData;
  302.     
  303.     /**
  304.      *  Master thread's priority, set by Thread::Init.
  305.      */
  306.     static ThreadPriority s_masterThreadPriority;
  307.     /**
  308.      *  Is initialized flag
  309.      */
  310.     static bool s_isInitialized; 
  311. };
  312. }
  313. #endif // !_OPENTHREADS_THREAD_