diff options
Diffstat (limited to 'README')
-rw-r--r-- | README | 153 |
1 files changed, 132 insertions, 21 deletions
@@ -24,8 +24,10 @@ conformance details and list of supported routines. Which of the several dll versions to use?
-----------------------------------------
-or, What are all these pthread*.dll files?
-------------------------------------------
+or,
+---
+What are all these pthread*.dll and pthread*.lib files?
+-------------------------------------------------------
Simply, you only use one of them, but you need to choose carefully.
@@ -40,24 +42,30 @@ to how POSIX threads cancelation and exit should work with languages that include exceptions and handlers, e.g.
C++ and even C (Microsoft's Structured Exceptions).
-The issue is: should cancelation of a thread in a, say,
-C++ application cause object destructors and C++ exception
+The issue is: should cancelation of a thread in, say,
+a C++ application cause object destructors and C++ exception
handlers to be invoked as the stack unwinds during thread
exit, or not?
-Your choice will depend primarily on whether your application
-is intended to be cross-platform or not, and how the POSIX threads
-implementations on the target platforms handle this issue. That is,
-you'll want consistent behaviour.
+There seems to be more opinion in favour of using the
+standard C version of the library (no EH) with C++ applications
+since this appears to be the assumption commercial pthreads
+implementations make. Therefore, if you use an EH version
+of pthreads-win32 then you may be under the illusion that
+your application will be portable, when in fact it is likely to
+behave very differently linked with other pthreads libraries.
-If you can't choose now, it's probably best to use the
-standard C version of the library, even if your application
-is being written in C++. You will need to handle the
-potentially adverse effects of thread cancelation in your
-code, but at least you will have the best chance of
-consistency of behaviour across platforms. If you later
-decide to use an exception handling version of the library
-then you will hopefully have fewer, if any, changes to make.
+Now you may be asking: why have you kept the EH versions of
+the library?
+
+There are a couple of reasons:
+- there is division amongst the experts and so the code may
+ be needed in the future. (Yes, it's in the repository and we
+ can get it out anytime in the future, but ...)
+- pthreads-win32 is one of the few implementations, and possibly
+ the only freely available one, that has EH versions. It may be
+ useful to people who want to play with or study application
+ behaviour under these conditions.
Library naming
@@ -65,9 +73,26 @@ Library naming Because the library is being built using various exception
handling schemes and compilers - and because the library
-will not work reliably if these are mixed in an application,
+may not work reliably if these are mixed in an application,
each different version of the library has it's own name.
+Note 1: the incompatibility is really between EH implementations
+of the different compilers. It should be possible to use the
+standard C version from either compiler with C++ applications
+built with a different compiler. If you use an EH version of
+the library, then you must use the same compiler for the
+application. This is another complication and dependency that
+can be avoided by using only the standard C library version.
+
+Note 2: if you use a standard C pthread*.dll with a C++
+application, then any functions that you define that are
+intended to be called via pthread_cleanup_push() must be
+__cdecl.
+
+Note 3: the intention is to also name either the VC or GC
+version (it should be arbitrary) as pthread.dll, including
+pthread.lib and libpthread.a as appropriate.
+
In general:
pthread[VG]{SE,CE,C}.dll
pthread[VG]{SE,CE,C}.lib
@@ -80,17 +105,17 @@ where: {SE,CE,C} indicates the exception handling scheme
SE - Structured EH
CE - C++ EH
- C - no exceptions - uses setjmp/longjmp
+ C - no exceptions - uses setjmp/longjmp
For example:
pthreadVSE.dll (MSVC/SEH)
pthreadGCE.dll (GNUC/C++ EH)
- pthreadGC.dll (GNUC/not dependent on exceptions)
+ pthreadGC.dll (GNUC/not dependent on exceptions)
The GNU library archive file names have changed to:
libpthreadGCE.a
- libpthreadGC.a
+ libpthreadGC.a
Other name changes
@@ -110,6 +135,82 @@ included a call to _pthread_processInitialize. You will now have to change that to ptw32_processInitialize.
+A note on Cleanup code default style
+------------------------------------
+
+Previously, if not defined, the cleanup style was determined automatically
+from the compiler used, and one of the following was defined accordingly:
+
+ __CLEANUP_SEH MSVC only
+ __CLEANUP_CXX C++, including MSVC++, GNU G++
+ __CLEANUP_C C, including GNU GCC, not MSVC
+
+These defines determine the style of cleanup (see pthread.h) and,
+most importantly, the way that cancelation and thread exit (via
+pthread_exit) is performed (see the routine ptw32_throw() in private.c).
+
+In short, the exceptions versions of the library throw an exception
+when a thread is canceled or exits (via pthread_exit()), which is
+caught by a handler in the thread startup routine, so that the
+the correct stack unwinding occurs regardless of where the thread
+is when it's canceled or exits via pthread_exit().
+
+In this snapshot, unless the build explicitly defines (e.g. via a
+compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then
+the build NOW always defaults to __CLEANUP_C style cleanup. This style
+uses setjmp/longjmp in the cancelation and pthread_exit implementations,
+and therefore won't do stack unwinding even when linked to applications
+that have it (e.g. C++ apps). This is for consistency with most/all
+commercial Unix POSIX threads implementations.
+
+Although it was not clearly documented before, it is still necessary to
+build your application using the same __CLEANUP_* define as was
+used for the version of the library that you link with, so that the
+correct parts of pthread.h are included. That is, the possible
+defines require the following library versions:
+
+ __CLEANUP_SEH pthreadVSE.dll
+ __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
+ __CLEANUP_C pthreadVC.dll or pthreadGC.dll
+
+THE POINT OF ALL THIS IS: if you have not been defining one of these
+explicitly, then the defaults as described at the top of this
+section were being used.
+
+THIS NOW CHANGES, as has been explained above, but to try to make this
+clearer here's an example:
+
+If you were building your application with MSVC++ i.e. using C++
+exceptions (rather than SEH) and not explicitly defining one of
+__CLEANUP_*, then __CLEANUP_C++ was defined for you in pthread.h.
+You should have been linking with pthreadVCE.dll, which does
+stack unwinding.
+
+If you now build your application as you had before, pthread.h will now
+set __CLEANUP_C as the default style, and you will need to link
+with pthreadVC.dll. Stack unwinding will now NOT occur when a thread
+is canceled, or the thread calls pthread_exit().
+
+Your application will now most likely behave differently to previous
+versions, and in non-obvious ways. Most likely is that locally
+instantiated objects may not be destroyed or cleaned up after a thread
+is canceled.
+
+If you want the same behaviour as before, then you must now define
+__CLEANUP_C++ explicitly using a compiler option and link with
+pthreadVCE.dll as you did before.
+
+
+WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY?
+Because no commercial Unix POSIX threads implementation allows you to
+choose to have stack unwinding. Therefore, providing it in pthread-win32
+as a default is dangerous. We still provide the choice but unless
+you consciously choose to do otherwise, your pthreads applications will
+now run or crash in similar ways irrespective of the threads platform
+you use. Or at least this is the hope.
+
+
+
Building under VC++ using C++ EH, Structured EH, or just C
----------------------------------------------------------
@@ -138,6 +239,11 @@ or: nmake clean VC
+or:
+
+nmake clean VCX (tests the VC version of the library with C++ (EH)
+ applications)
+
Building under Mingw32
----------------------
@@ -162,6 +268,11 @@ or: make clean GC
+or:
+
+make clean GCX (tests the GC version of the library with C++ (EH)
+ applications)
+
Building the library under Cygwin
---------------------------------
@@ -213,7 +324,7 @@ Building applications with GNU compilers If you're using pthreadGCE.dll:
-Use gcc-2.95.2-1 or later modified as per pthreads-win32 FAQ question 6.
+Use gcc-2.95.2-1 or later modified as per pthreads-win32 FAQ question 11.
With the three header files, pthreadGCE.dll, gcc.dll and libpthreadGCE.a
in the same directory as your application myapp.c, you could compile,
|