https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91805
Bug ID: 91805
Summary: Data race in std::locale::classic
Product: gcc
Version: 9.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: chris at clearwater dot dev
Target Milestone: ---
Created attachment 46894
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46894&action=edit
Fixes data race
std::locale::classic() uses gthread_once to initialize the classic locale impl
in a thread-safe manner but then uses placement new without any synchronization
to construct a locale into static global aligned storage.
This is a data race as you can end up with multiple threads all racing to write
to the same memory location.
I suggest the attached fix which moves the placement new into the ghtread_once
block and then simply reinterpret_casts the global static aligned storage in
std::locale::classic(). This should be fine as the constructor is just storing
a pointer the the impl and the destructor is never called.