On Fri, Apr 11, 2025 at 4:28 PM Jonathan Wakely <jwak...@redhat.com> wrote:
> The gcc4-compatible copy-on-write std::string does not conform to the > C++11 requirements on data race avoidance in standard containers. > Specifically, calling non-const member functions such as begin() and > data() needs to do the "copy on write" operation and so is most > definitely a modification of the object. As such, those non-const > members must not be called concurrently with any other uses of the > string object. > > libstdc++-v3/ChangeLog: > > PR libstdc++/21334 > * doc/xml/manual/using.xml: Document that container data race > avoidance rules do not apply to COW std::string. > * doc/html/*: Regenerate. > --- > LGTM. Thanks > libstdc++-v3/doc/html/manual/using_concurrency.html | 10 ++++++++++ > libstdc++-v3/doc/xml/manual/using.xml | 12 ++++++++++++ > 2 files changed, 22 insertions(+) > > diff --git a/libstdc++-v3/doc/html/manual/using_concurrency.html > b/libstdc++-v3/doc/html/manual/using_concurrency.html > index d21f1588494..d570d3a2b84 100644 > --- a/libstdc++-v3/doc/html/manual/using_concurrency.html > +++ b/libstdc++-v3/doc/html/manual/using_concurrency.html > @@ -126,6 +126,16 @@ gcc version 4.1.2 20070925 (Red Hat 4.1.2-33) > the container the iterator refers to (for example incrementing a > list iterator must access the pointers between nodes, which are > part > of the container and so conflict with other accesses to the > container). > + </p><p> > + The Copy-On-Write <code class="classname">std::string</code> > implementation > + used before GCC 5 (and with > + <a class="link" href="using_dual_abi.html" title="Dual > ABI">_GLIBCXX_USE_CXX11_ABI=0</a>) > + is not a standard container and does not conform to the data race > + avoidance rules described above. For the Copy-On-Write > + <code class="classname">std::string</code>, non-const member > functions such as > + <code class="function">begin()</code> are considered to be > modifying accesses > + and so must not be used concurrently with any other accesses to > the > + same object. > </p><p>Programs which follow the rules above will not encounter data > races in library code, even when using library types which share > state between distinct objects. In the example below the > diff --git a/libstdc++-v3/doc/xml/manual/using.xml > b/libstdc++-v3/doc/xml/manual/using.xml > index 7ca3a3f4b4c..bf92c495f6d 100644 > --- a/libstdc++-v3/doc/xml/manual/using.xml > +++ b/libstdc++-v3/doc/xml/manual/using.xml > @@ -2069,6 +2069,18 @@ gcc version 4.1.2 20070925 (Red Hat 4.1.2-33) > of the container and so conflict with other accesses to the > container). > </para> > > + <para> > + The Copy-On-Write <classname>std::string</classname> > implementation > + used before GCC 5 (and with > + <link > linkend="manual.intro.using.abi">_GLIBCXX_USE_CXX11_ABI=0</link>) > + is not a standard container and does not conform to the data race > + avoidance rules described above. For the Copy-On-Write > + <classname>std::string</classname>, non-const member functions > such as > + <function>begin()</function> are considered to be modifying > accesses > + and so must not be used concurrently with any other accesses to > the > + same object. > + </para> > + > <para>Programs which follow the rules above will not encounter data > races in library code, even when using library types which share > state between distinct objects. In the example below the > -- > 2.49.0 > >