|
- /***************************************************/
- /*! \class Thread
- \brief STK thread class.
-
- This class provides a uniform interface for cross-platform
- threads. On unix systems, the pthread library is used. Under
- Windows, the C runtime threadex functions are used.
-
- Each instance of the Thread class can be used to control a single
- thread process. Routines are provided to signal cancelation
- and/or joining with a thread, though it is not possible for this
- class to know the running status of a thread once it is started.
-
- For cross-platform compatability, thread functions should be
- declared as follows:
-
- THREAD_RETURN THREAD_TYPE thread_function(void *ptr)
-
- by Perry R. Cook and Gary P. Scavone, 1995--2017.
- */
- /***************************************************/
-
- #include "Thread.h"
-
- namespace stk {
-
- Thread :: Thread()
- {
- thread_ = 0;
- }
-
- Thread :: ~Thread()
- {
- }
-
- bool Thread :: start( THREAD_FUNCTION routine, void * ptr )
- {
- if ( thread_ ) {
- oStream_ << "Thread:: a thread is already running!";
- handleError( StkError::WARNING );
- return false;
- }
-
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- if ( pthread_create(&thread_, NULL, *routine, ptr) == 0 )
- return true;
-
- #elif defined(__OS_WINDOWS__)
- unsigned thread_id;
- thread_ = _beginthreadex(NULL, 0, routine, ptr, 0, &thread_id);
- if ( thread_ ) return true;
-
- #endif
- return false;
- }
-
- bool Thread :: cancel()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- if ( pthread_cancel(thread_) == 0 ) {
- return true;
- }
-
- #elif defined(__OS_WINDOWS__)
-
- TerminateThread((HANDLE)thread_, 0);
- return true;
-
- #endif
- return false;
- }
-
- bool Thread :: wait()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- if ( pthread_join(thread_, NULL) == 0 ) {
- thread_ = 0;
- return true;
- }
-
- #elif defined(__OS_WINDOWS__)
-
- long retval = WaitForSingleObject( (HANDLE)thread_, INFINITE );
- if ( retval == WAIT_OBJECT_0 ) {
- CloseHandle( (HANDLE)thread_ );
- thread_ = 0;
- return true;
- }
-
- #endif
- return false;
- }
-
- void Thread :: testCancel(void)
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_testcancel();
-
- #endif
- }
-
- } // stk namespace
|