On Aug 30, 2005, at 3:34 AM, Daniel Krügler wrote:
Howard Hinnant wrote:
On Aug 29, 2005, at 3:47 PM, Peter Dimov wrote:
I haven't studied the threadmon code in detail, though. It might be possible to destroy the threadmon mutex safely at some point during shutdown.
I haven't studied threadmon either. But from the sounds of it, you may want to consider a "phoenix" singleton, nicely documented in Andrei Alexandrescu's MC++D. One hitch to get a working phoenix singleton is to have a working atexit function (and I mean really working correctly). There was a lwg dr report on it:
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#3
which has now received TC status, meaning it is a normative part of the C++03 standard. I have no information on how well the various platforms conform to the standard in this regard (it can be tested for though).
The idea is fairly simple. The singleton factory keeps state that tells it whether the singleton is constructed or not. When the singleton gets constructed, it registers a "destructor" with atexit. If after the atexit runs the destructor, the singleton is needed again, then it recreates itself, and re-registers with atexit. A correctly working atexit will properly run this newly registered function as it continues to process the atexit chain.
Interestingly a more recent report from Plauger - but still open - recommends a contradictory advice (at least as far as I understand it), see
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#462
<nod> The notes (in italic) are from Lillehammer this Spring. I was one of the voices leaning towards NAD. To be fair, getting this right depends on cooperation between the C++ compiler, the C library and the runtime library, which is not an easy cooperation to manage. I.e. it is a logistical problem, not a technical one. On the positive side also note that the "Itanium C++ ABI" correctly addresses this issue. http://www.codesourcery.com/cxx-abi/abi.html#dso-dtor (at least as far as I can tell) -Howard