[c++-pthreads] thread-safety definition

Dave Butenhof David.Butenhof at hp.com
Thu Jan 8 11:34:12 UTC 2004


Mathieu Lacage wrote:

>Definition "cancelation"
>------------------------
>All OSes provide a mean to stop the execution flow of a thread either
>from the inside of the thread or from the outside.
>
>1) "inside cancelation": This is basically ExitThread (win32 name). It
>exists on all the platforms which support a form of threads or another I
>know of. It semantics vary a lot from one platform to the other
>unfortunatly. On win32, it will not invoke any thread-specific cleanup
>handlers (neither C++ exceptions nor SEH are involved). On BeOS
>(exit_thread), it will behave just like on windows. On POSIX
>(pthread_exit) systems, it will invoke the thread-specific cancelation
>handlers.
>  
>
The term "cancellation" seems heavy here. This is just a voluntary 
termination. But, yes, there are similar properties -- certainly from 
the point of view of the rest of the frames on the call stack at the time.

>2) "outside cancelation": There are two kinds of "outside cancelation":
>
>	2.1) "async cancelation": The OS removes the thread from its list of
>tasks to schedule and does nothing to cleanup the thread ressources.
>This is the most extreme useless feature of a thread library. BeOS and
>win32 provide it. POSIX does not provide it.
>  
>
I'd call this "abort", largely because there was at one time a proposal 
for a POSIX function to achieve this, which would have been called 
pthread_abort().

POSIX already defines "async cancel", as a mode where posting a cancel 
to a thread will cause the cancellation to be delivered at any arbitrary 
time supported by the OS and hardware. (Usually on the next clock tick, 
though that's a "common implementation" rather than any rule or even 
recommendation.)

>	2.2) "defered cancelation": I know of only POSIX to implement this. The
>canceled flag for the target thread is set and the thread cancelation
>handlers are invoked whenever the thread reaches a cancelation point
>(that is, it calls one of a set of specific library functions).
>  
>
"Cancellation" (both deferred and async) come from the Digital "CMA" 
architecture (where it was called "alert"). The CMA concept derives from 
a less structured (but fundamentally similar) capability in the SRC 
research labs' Topaz thread package.

>Definition "Posix thread-safety":
>---------------------------------
>A library is "posix thread-safe" if it is thread-safe and
>defered-cancelation-safe.
>  
>
I wouldn't tack cancel-safety onto thread-safety so intimately, although 
I would agree that it's pointless to declare a general library function 
"thread safe under POSIX" unless it also supports deferred cancellation. 
(Async cancel is an oddity; there are, and should be, very few 
async-cancel-safe functions. Async-cancel regions of code cannot 
accomodate resource acquisition or release of any sort, as the recovery 
code is generally unable to determine the state of the resource.)

Nevertheless, it's quite reasonable to write a "thread-safe" special 
purpose application routine that doesn't deal with cancellation simply 
because the designer KNOWS that a thread running that code cannot be 
cancelled. One might even make this choice within in a general purpose 
library in some cases -- say, for a daemon thread that could never run 
application code nor be identified to the application, and that 
therefore cannot be cancelled.

-- 
/--------------------[ David.Butenhof at hp.com ]--------------------\
| Hewlett-Packard Company       Tru64 UNIX & VMS Thread Architect |
|     My book: http://www.awl.com/cseng/titles/0-201-63392-2/     |
\----[ http://homepage.mac.com/dbutenhof/Threads/Threads.html ]---/




More information about the c++-pthreads mailing list