pthread_cleanup_push & pthread_cleanup_pop usage

Daniel Eischen deischen at
Wed Oct 8 20:40:31 UTC 2008

On Wed, 8 Oct 2008, Alfred Perlstein wrote:

> * John Hein <jhein at> [081008 12:48] wrote:
>> John Baldwin wrote at 14:09 -0400 on Oct  8, 2008:
>> > Don't Do That (tm).  The spec explicitly states that they can be defined as
>> > macros and that code using it needs to put them in the same block.
>> Thanks for the responses.  I like deischen's response best to work
>> around the problem short term, but I suspect that's not very portable.

It's probably more portable than you think.  The library
calls really need to be there so they can be linked to
from non-C languages.

>> And as jhb describes using it outside the same block violates the
>> spirit of intended use.
>> Note that the example I gave (pop off the cleanup stack in a catch
>> block) is not our only "violation".  We also push in one function and
>> either never [explicitly] pop or possibly pop in another function.
>> So that leaves me wondering about possible techniques for cleanup on
>> thread cancellation or exit.  Alfred touched on one method, and I see
>> that pthread_key_create takes an optional destructor, so that sounds
>> like a possible avenue to explore.
> I'm positive that you'll have a solution given my starting point
> within a few hours. :)
> All the cpp_cleanup_push() needs to do is to:
>  pthread_once() -> set up the pthread_key and destructor as you said.
>  then pthread_getspecific to get the stack
>    if no stack, make one and set it.
>  then push your cleanup function.
> good luck,


More information about the freebsd-threads mailing list