
Andrey Semashev <andysem <at> mail.ru> writes:
Anthony Williams wrote:
How is this to be managed? Cleanup handlers for the TLS key need to run in the context of each thread, and only run when a thread changes its value with reset(), or when the thread exits. You cannot invoke a cleanup handler for another thread.
Hmm, I missed that. But how does it work now? I mean, how the cleanup handlers are called in the current implementation when the thread_specific_ptr is destroyed? You should call them in context of their threads anyway.
The cleanup handler is called in the context of each thread when the thread exits --- the cleanup handler itself is reference counted. If you destroy a thread_specific_ptr, and then access it from any thread (whether to get or set the value), then the behaviour is undefined, as for any object accessed after its destruction.
The thread_specific_ptr is a bit clunky altogether. I intend to come up with something better in the future, but it may be moot once compilers start implementing the new thread_local storage duration.
I think, efforts on thread_specific_ptr are not completely worthless. Even after C++0x is out and supported by the most wide-spread compilers we will still have to write backwards-compatible code to support older compilers for some time. MSVC 6 support is an example of such evolution history.
Agreed. Anthony -- Anthony Williams Just Software Solutions Ltd - http://www.justsoftwaresolutions.co.uk Registered in England, Company Number 5478976. Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL