libstdc++: Document thread-safety for COW std::string [PR21334]

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.
This commit is contained in:
Jonathan Wakely 2025-04-11 11:08:34 +01:00 committed by Jonathan Wakely
parent 2f334a10bc
commit dd35f66287
No known key found for this signature in database
2 changed files with 22 additions and 0 deletions

View file

@ -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

View file

@ -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