Boost logo

Boost :

From: terekhov (terekhov_at_[hidden])
Date: 2002-01-16 15:20:34


--- In boost_at_y..., "bill_kempf" <williamkempf_at_h...> wrote:
[...]
> > "Constructors
> >
> > thread();
> >
> > Effects: Constructs a thread object representing the current
> thread
> > of
> > execution.
> >
> > Postcondition: *this is non-joinable.
> >
> > Danger: *this is valid only within the current thread"
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> Ahh. Sorry, I forgot I specified this in the documentation. This
> may be an overspecification on my part and easily fixed. I
probably
> specified this to make the Win32 implementation as fast as possible.

Do you mean GetCurrentThread pseudo handle?

The following is not that much slower and is
thread-shareable calling DuplicateHandle 0/1
times only:

http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/misc.c?
rev=1.40&content-type=text/x-cvsweb-markup&cvsroot=pthreads-win32

int
pthread_equal (pthread_t t1, pthread_t t2)
     /*
      * ------------------------------------------------------
      * DOCPUBLIC
      * This function returns zero if t1 and t2 are equal, else
      * returns nonzero
      *
      * PARAMETERS
      * t1,
      * t2
      * references to an instances of thread_t
      *
      *
      * DESCRIPTION
      * This function returns nonzero if t1 and t2 are equal,
else
      * returns zero.
      *
      * RESULTS
      * non-zero if t1 and t2 refer to the same
thread,
      * 0 t1 and t2 do not refer to the
same thread
      *
      * ------------------------------------------------------
      */
{
  int result;

  /*
   * We also accept NULL == NULL - treating NULL as a thread
   * for this special case, because there is no error that we can
return.
   */
  result = ( ( t1 == t2 ) && ( t1 == NULL || ( t1->thread == t2-
>thread ) ) );

  return (result);

} /* pthread_equal */

pthread_t
pthread_self (void)
     /*
      * ------------------------------------------------------
      * DOCPUBLIC
      * This function returns a reference to the current running
      * thread.
      *
      * PARAMETERS
      * N/A
      *
      *
      * DESCRIPTION
      * This function returns a reference to the current running
      * thread.
      *
      * RESULTS
      * pthread_t reference to the current thread
      *
      * ------------------------------------------------------
      */
{
  pthread_t self;

#ifdef _UWIN
        if(!ptw32_selfThreadKey)
                return(NULL);
#endif

  self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey);

  if (self == NULL)
    {
      /*
       * Need to create an implicit 'self' for the currently
       * executing thread.
       */
      self = ptw32_new();

      if (self != NULL)
        {
          /*
           * This is a non-POSIX thread which has chosen to call
           * a POSIX threads function for some reason. We assume that
           * it isn't joinable, but we do assume that it's
           * (deferred) cancelable.
           */
          self->implicit = 1;
          self->detachState = PTHREAD_CREATE_DETACHED;
          self->thread = GetCurrentThreadId ();

#ifdef NEED_DUPLICATEHANDLE
          /*
           * DuplicateHandle does not exist on WinCE.
           *
           * NOTE:
           * GetCurrentThread only returns a pseudo-handle
           * which is only valid in the current thread context.
           * Therefore, you should not pass the handle to
           * other threads for whatever purpose.
           */
          self->threadH = GetCurrentThread();
#else
          if( !DuplicateHandle(
                               GetCurrentProcess(),
                               GetCurrentThread(),
                               GetCurrentProcess(),
                               &self->threadH,
                               0,
                               FALSE,
                               DUPLICATE_SAME_ACCESS ) )
            {
              free( self );
              return (NULL);
            }
#endif
        }

      pthread_setspecific (ptw32_selfThreadKey, self);
    }

  return (self);

} /* pthread_self */

regards,
alexander.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk