This is the mail archive of the
mailing list for the pthreas-win32 project.
Re: cancelation problem
- To: Erik Hensema <erik dot hensema at group2000 dot nl>
- Subject: Re: cancelation problem
- From: Ross Johnson <rpj at ise dot canberra dot edu dot au>
- Date: Wed, 10 Nov 1999 12:19:57 +1100 (EST)
- cc: "'Pthreads-win32'" <pthreads-win32 at sourceware dot cygnus dot com>
On Mon, 8 Nov 1999, Erik Hensema wrote:
> I'm investigating a problem regarding thread cancelation. The thread I want
> to cancel has PTHREAD_CANCEL_ASYNCHRONOUS, however, this piece of code
> blocks on the join():
> if ((retv = Pthread_cancel( recvThread )) == 0)
> retv = Pthread_join( recvThread, 0 );
> Pthread_* are just macro's; they call pthread_*.
> The thread recvThread seems to block on a select() call. It doesn't get
> Two questions:
> 1) is this normal behaviour?
> 2) if not, how does the cancel mechanism work? I'm not very familliar to
> win32 programming, so I don't really understand how the *Event() family of
> calls work.
The answer to your first question is, normal POSIX behaviour would
be to asynchronously cancel the thread.
Pthreads-win32 doesn't support asynchronous cancelation, only
deferred, which is also very limited. The reason there is no async
cancelation is that it's very hard, if not impossible, to implement
on top of Win32.
Incidently, Butenhof "Programming with POSIX Threads" recommends
not using async cancelation because the possible side effects are
unpredictable, especially if you're trying to write portable code.
Using deferred cancelation would normally be the way to go, however,
even though the POSIX threads standard lists a number of C library
functions that are defined as deferred cancelation points, there is
no hookup between those which are provided by Windows and the
Incidently, it's worth noting for code portability that the POSIX
threads standard list doesn't include "select" because (as I read in
Butenhof) it isn't recognised by POSIX.
Effectively, the only cancelation points that pthreads-win32 can
recognise are those the library implements itself, ie.
Hmmm, pthread_join should also be a cancelation point, but I see
that it isn't yet. That should be easy to fix.
Pthreads-win32 also provides two functions that allow you to create
cancelation points within your application, but only for cases where
a thread is going to block on a Win32 handle. These are:
pthreadCancelableWait(HANDLE waitHandle) /* Infinite wait */
pthreadCancelableTimedWait(HANDLE waitHandle, DWORD timeout)
| Ross Johnson | | E-Mail: email@example.com
| Info Sciences and Eng|___|
| University of Canberra | FAX: +61 6 2015227
| PO Box 1 |
| Belconnen ACT 2616 | WWW: http://willow.canberra.edu.au/~rpj/
| AUSTRALIA |