Boost logo

Boost :

Subject: Re: [boost] Boost sprint: #3407 boost::call_once not re-entrant (at least in win32)
From: Anthony Williams (anthony.ajw_at_[hidden])
Date: 2009-11-23 16:01:57

Gottlob Frege <gottlobfrege_at_[hidden]> writes:

> On Mon, Nov 23, 2009 at 12:26 PM, Anthony Williams
> <anthony.ajw_at_[hidden]> wrote:
>> You don't need a new event. If the event is set it means "check the
>> status". So thread enters call_once. Sees status is "running" and waits
>> on the event. When the event is set it wakes and checks status. If
>> status is complete, we're done. If status is running, wait for the same
>> event again. If status is "not done", set it to running, reset the event
>> and run the function. On completion, set status to "complete" and set
>> the event. On exception, set status to "not done" and set the event.
>> I'll code it up.

> It is worth giving it a try, but we went down that road in
> pthreads-win32. I think the hard part is the 'reset the event' step.
> There were problems with whether the event should be manual or
> auto-reset, and with the 3rd thread in looping without waiting, etc.
> IIRC manual means you have a hard time knowing when to reset (ie did
> everyone or ANYONE wait yet - you could close too early), auto-reset
> meant that each 'waker' needed to wake the next one, etc. I can't
> remember what was really bad about chaining the waking of the waiters.
> Maybe it just felt a bit queasy.

I can see that there's potential for these problems. I also think I can
see a way round them. I'll find out when I'm done coding.

> But I have a lot of faith in your work, so you may very well find
> something that we missed.

Thanks for the vote of confidence.


Author of C++ Concurrency in Action |
just::thread C++0x thread library   |
Just Software Solutions Ltd         |
15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK. Company No. 5478976

Boost list run by bdawes at, gregod at, cpdaniel at, john at