[committed] libstdc++: Use __libc_single_threaded to optimise atomics [PR 96817]

Jonathan Wakely jwakely@redhat.com
Fri Oct 2 21:35:12 GMT 2020


On 26/09/20 20:42 +0100, Jonathan Wakely wrote:
>Glibc 2.32 adds a global variable that says whether the process is
>single-threaded. We can use this to decide whether to elide atomic
>operations, as a more precise and reliable indicator than
>__gthread_active_p.
>
>This means that guard variables for statics and reference counting in
>shared_ptr can use less expensive, non-atomic ops even in processes that
>are linked to libpthread, as long as no threads have been created yet.
>It also means that we switch to using atomics if libpthread gets loaded
>later via dlopen (this still isn't supported in general, for other
>reasons).
>
>We can't use __libc_single_threaded to replace __gthread_active_p
>everywhere. If we replaced the uses of __gthread_active_p in std::mutex
>then we would elide the pthread_mutex_lock in the code below, but not
>the pthread_mutex_unlock:
>
>  std::mutex m;
>  m.lock();            // pthread_mutex_lock
>  std::thread t([]{}); // __libc_single_threaded = false
>  t.join();
>  m.unlock();          // pthread_mutex_unlock
>
>We need the lock and unlock to use the same "is threading enabled"
>predicate, and similarly for init/destroy pairs for mutexes and
>condition variables, so that we don't try to release resources that were
>never acquired.
>
>There are other places that could use __libc_single_threaded, such as
>_Sp_locker in src/c++11/shared_ptr.cc and locale init functions, but
>they can be changed later.
>
>libstdc++-v3/ChangeLog:
>
>	PR libstdc++/96817
>	* include/ext/atomicity.h (__gnu_cxx::__is_single_threaded()):
>	New function wrapping __libc_single_threaded if available.
>	(__exchange_and_add_dispatch, __atomic_add_dispatch): Use it.
>	* libsupc++/guard.cc (__cxa_guard_acquire, __cxa_guard_abort)
>	(__cxa_guard_release): Likewise.
>	* testsuite/18_support/96817.cc: New test.
>

The new test was broken, fixed with this.

Tested powerpc64le-linux, with glibc 2.31 and 2.32. Committed to trunk.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 1279 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20201002/cecde9c7/attachment.bin>


More information about the Libstdc++ mailing list