Подскажите, а что происходит под капотом __gthrw_pthread_once ? Там разве не double checked locking?
Я не знаю, как это реализовано на PowerPC при использовании xLC. https://www.ibm.com/support/knowledgecenter/SSGH2K_12.1.0/com.ibm.xlc121.aix.doc/compiler_ref/opt_tls.html TLS там по дефолту выключен, а для этого случая в libstdc++ я вижу вот такое:
728 /// call_once
729 template<typename _Callable, typename... _Args>
730 void
731 call_once(once_flag& __once, _Callable&& __f, _Args&&... __args)
732 {
733 #ifdef _GLIBCXX_HAVE_TLS
734 auto __bound_functor = std::__bind_simple(std::forward<_Callable>(__f),
735 std::forward<_Args>(__args)...);
736 __once_callable = &__bound_functor;
737 __once_call = &__once_call_impl<decltype(__bound_functor)>;
738 #else
739 unique_lock<mutex> __functor_lock(__get_once_mutex());
740 auto __callable = std::__bind_simple(std::forward<_Callable>(__f),
741 std::forward<_Args>(__args)...);
742 __once_functor = [&]() { __callable(); };
743 __set_once_functor_lock_ptr(&__functor_lock);
744 #endif
Если в их стандартной библиотеке такая же реализация, то я лучше свой велосипед сделаю, который гарантированно везде на атомиках.