src/c++11/shared_ptr.cc has: __gnu_cxx::__mutex& get_mutex(unsigned char i) { static __gnu_cxx::__mutex m[mask + 1]; return m[i]; } This should be: __gnu_cxx::__mutex& get_mutex(unsigned char i) { struct M { alignas(C) __gnu_cxx::__mutex mx; }; static M m[mask + 1]; return m[i].mx; } where C == std::hardware_destructive_interference_size
A slightly simpler fix: --- a/libstdc++-v3/src/c++11/shared_ptr.cc +++ b/libstdc++-v3/src/c++11/shared_ptr.cc @@ -34,7 +34,9 @@ namespace __gnu_internal _GLIBCXX_VISIBILITY(hidden) __gnu_cxx::__mutex& get_mutex(unsigned char i) { - static __gnu_cxx::__mutex m[mask + 1]; + // increase alignment to ensure each lock is on a separate cache line + struct alignas(64) M : __gnu_cxx::__mutex { }; + static M m[mask + 1]; return m[i]; } }
Author: redi Date: Mon Apr 29 12:55:29 2019 New Revision: 270649 URL: https://gcc.gnu.org/viewcvs?rev=270649&root=gcc&view=rev Log: PR libstdc++/71312 Increase alignment of pooled mutexes PR libstdc++/71312 * src/c++11/shared_ptr.cc (get_mutex): Align pool mutexes to 64 bytes. Modified: trunk/libstdc++-v3/ChangeLog trunk/libstdc++-v3/src/c++11/shared_ptr.cc
Fixed on trunk.