How is pthread_self() implemented?

Ross Johnson rpj@ise.canberra.edu.au
Mon Sep 1 04:33:00 GMT 2003


Chris Seaton wrote:

>I'm writing my own (very lightweight) threading library for Windows and
>POSIX threads. There are reasons why I can't use pthreads-win32, but
>they aren't important here. I'm currently implementing a ThisThread()
>routine. With POSIX threads I simply call pthread_self(), but I'm stuck
>for Windows.
>
>Originally I called GetCurrentThread(), but that returns a pseudo
>handle, so I call DuplicateHandle(), as this pthreads-win32 library
>uses.
>
>However, DuplicateHandle() creates a new handle every time it is called,
>so I can't compare them. Basically
>
>ThisThread() != ThisThread()
>
>How does the pthreads-win32 library solve this problem?
>  
>
Pthreads-win32 keeps a POSIX thread struct in which it stores the handle 
returned by the original Win32 CreateThread(). The pointer to the POSIX 
struct is kept in TLS (TSD) so that other pthread library functions can 
refer to that struct.

John Bossom's original design also allows for pre-existing Win32 threads 
to use any POSIX routines, and therefore fully interact with POSIX 
threads, by creating a one-time-only on-the-fly detached POSIX thread 
handle for the Win32 thread. In this case, the library uses 
DuplicateHandle(), which is sufficient for our purposes.

This is the logic you'll see in pthread_self.c at the following URL (all 
one line):
http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/pthread_self.c?rev=1.2&content-type=text/x-cvsweb-markup&cvsroot=pthreads-win32

Regards.
Ross




More information about the Pthreads-win32 mailing list