[PATCH] pthread_once hangs when init routine throws an exception [BZ #18435]
Szabolcs Nagy
szabolcs.nagy@arm.com
Mon Jun 1 10:20:00 GMT 2015
On 31/05/15 22:37, Martin Sebor wrote:
> The C++ 2011 std::call_once function is specified to allow
> the initialization routine to exit by throwing an exception.
> Such an execution, termed exceptional, requires call_once to
> propagate the exception to its caller. A program may contain
> any number of exceptional executions but only one returning
> execution (which, if it exists, must be the last execution
> with the same once flag).
>
> On POSIX systems such as Linux std::call_once is implemented
> in terms of pthread_once. However, as discussed in libstdc++
> bug 66146 - "call_once not C++11-compliant on ppc64le," GLIBC's
> pthread_once hangs when the initialization function exits by
> throwing an exception on at least arm and ppc64 (though
> apparently not on x86_64). This effectively prevents call_once
> from conforming to the C++ requirements since there doesn't
> appear to be a thread-safe way to work around this problem in
> libstdc++.
>
i think this should be fixed in libstdc++ even if glibc guarantees
that exceptions work from the pthread_once init function.
posix cannot give c++ exception safety guarantees.
(even if the rationale has vague statements along those lines).
(libstdc++ lock semantics does not match posix mutexes either:
for c++ weaker acquire-release ordering is enough).
so maybe libstdc++ should consider implementing locks and call_once
with the correct semantics independent of libc (and then maybe it
can get rid of the horrible gthr-posix.h weak reference hacks too).
More information about the Libc-alpha
mailing list