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