This is the mail archive of the pthreads-win32@sources.redhat.com mailing list for the pthreas-win32 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How is pthread_self() implemented?


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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]