<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
	<channel>
		<title>"More C++ Idioms" - Wikibook Updates</title>
		<link>https://en.wikibooks.org/wiki/Special:RecentChangesLinked</link>
		<description>"More C++ Idioms" is an exhaustive yet continuously growing online catalog of reusable C++ idioms that expert C++ programmers often use while programming/designing using C++. This feed provides quick and easy access to the updates to the book contents.</description>
		<language>en</language>
		<generator>MediaWiki 1.41.0-wmf.11</generator>
		<lastBuildDate>Mon, 05 Jun 2023 00:34:15 GMT</lastBuildDate>
		<item>
			<title>More C++ Idioms/Contents</title>
			<link>https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Contents&amp;diff=4295504&amp;oldid=3743377</link>
			<guid isPermaLink="false">https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Contents&amp;diff=4295504&amp;oldid=3743377</guid>
			<description>&lt;p&gt;add thread-safe copy on write idiom&lt;/p&gt;
&lt;table style="background-color: #fff; color: #202122;" data-mw="interface"&gt;
				&lt;col class="diff-marker" /&gt;
				&lt;col class="diff-content" /&gt;
				&lt;col class="diff-marker" /&gt;
				&lt;col class="diff-content" /&gt;
				&lt;tr class="diff-title" lang="en"&gt;
				&lt;td colspan="2" style="background-color: #fff; color: #202122; text-align: center;"&gt;← Older revision&lt;/td&gt;
				&lt;td colspan="2" style="background-color: #fff; color: #202122; text-align: center;"&gt;Revision as of 00:28, 4 June 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 22:&lt;/td&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 22:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Copy-and-swap|Copy-and-swap]] {{stage short|75%|10 August 2007}} &lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Copy-and-swap|Copy-and-swap]] {{stage short|75%|10 August 2007}} &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Copy-on-write|Copy-on-write]] {{stage short|100%|20 May 2009}} &lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Copy-on-write|Copy-on-write]] {{stage short|100%|20 May 2009}} &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Thread-safe Copy-on-write|Thread-safe Copy-on-write]] {{stage short|100%|20 May 2009}} &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Counted Body|Intrusive reference counting (Counted Body)]] {{stage short|75%|16 November 2007}} &lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Counted Body|Intrusive reference counting (Counted Body)]] {{stage short|75%|16 November 2007}} &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Covariant Return Types|Covariant Return Types]] TODO&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;# [[More C++ Idioms/Covariant Return Types|Covariant Return Types]] TODO&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key enwikibooks:diff:wikidiff2:1.12:old-3743377:rev-4295504:1.13.0 --&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 04 Jun 2023 00:28:28 GMT</pubDate>
			<dc:creator>Dzejmson</dc:creator>
			<comments>https://en.wikibooks.org/wiki/Talk:More_C%2B%2B_Idioms/Contents</comments>
		</item>
		<item>
			<title>More C++ Idioms/Thread-safe Copy-on-write</title>
			<link>https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Thread-safe_Copy-on-write&amp;diff=4295503&amp;oldid=4295502</link>
			<guid isPermaLink="false">https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Thread-safe_Copy-on-write&amp;diff=4295503&amp;oldid=4295502</guid>
			<description>&lt;p&gt;add thread safe copy on write&lt;/p&gt;
&lt;table style="background-color: #fff; color: #202122;" data-mw="interface"&gt;
				&lt;col class="diff-marker" /&gt;
				&lt;col class="diff-content" /&gt;
				&lt;col class="diff-marker" /&gt;
				&lt;col class="diff-content" /&gt;
				&lt;tr class="diff-title" lang="en"&gt;
				&lt;td colspan="2" style="background-color: #fff; color: #202122; text-align: center;"&gt;← Older revision&lt;/td&gt;
				&lt;td colspan="2" style="background-color: #fff; color: #202122; text-align: center;"&gt;Revision as of 00:26, 4 June 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 23:&lt;/td&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 23:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        // constructors...&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        // constructors...&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        &lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        // fast access without locks&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        RefPtr read() const&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        RefPtr read() const&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        {&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 28:&lt;/td&gt;
  &lt;td colspan="2" class="diff-lineno"&gt;Line 29:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        }&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        }&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        &lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        // overwrites current data&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_7_0_rhs"&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;&lt;a name="movedpara_4_0_lhs"&gt;&lt;/a&gt;        // with mutex it can be called by multiple threads at once&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan="2" class="diff-empty diff-side-added"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker" data-marker="−"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        void update(&lt;del style="font-weight: bold; text-decoration: none;"&gt;new_data &lt;/del&gt;T)&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        void update(T&lt;ins style="font-weight: bold; text-decoration: none;"&gt; new_data&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        {&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_4_0_lhs"&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;&lt;a name="movedpara_7_0_rhs"&gt;&lt;/a&gt;&lt;ins style="font-weight: bold; text-decoration: none;"&gt;    &lt;/ins&gt;        // with mutex it can be called by multiple threads at once&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::lock_guard&amp;lt;std::mutex&amp;gt; lock(write_mut);&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::lock_guard&amp;lt;std::mutex&amp;gt; lock(write_mut);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            auto new_ptr = std::shared_ptr&amp;lt;std::string&amp;gt;(new T(std::move(new_data)));&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            auto new_ptr = std::shared_ptr&amp;lt;std::string&amp;gt;(new T(std::move(new_data)));&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::atomic_store(&amp;amp;data, new_ptr);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        }&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        // adds data to a existing collection&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        template &amp;lt;typename U&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        void add_item(U new_data)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::lock_guard&amp;lt;std::mutex&amp;gt; lock(write_mut);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            auto data_copy = *this-&amp;gt;read();&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            data_copy.insert(new_data)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan="2" class="diff-empty diff-side-deleted"&gt;&lt;/td&gt;
  &lt;td class="diff-marker" data-marker="+"&gt;&lt;/td&gt;
  &lt;td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            auto new_ptr = std::shared_ptr&amp;lt;std::string&amp;gt;(new T(std::move(data_copy)));&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::atomic_store(&amp;amp;data, new_ptr);&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;            std::atomic_store(&amp;amp;data, new_ptr);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        }&lt;/div&gt;&lt;/td&gt;
  &lt;td class="diff-marker"&gt;&lt;/td&gt;
  &lt;td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"&gt;&lt;div&gt;        }&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key enwikibooks:diff:wikidiff2:1.12:old-4295502:rev-4295503:1.13.0 --&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 04 Jun 2023 00:26:55 GMT</pubDate>
			<dc:creator>Dzejmson</dc:creator>
			<comments>https://en.wikibooks.org/wiki/Talk:More_C%2B%2B_Idioms/Thread-safe_Copy-on-write</comments>
		</item>
		<item>
			<title>More C++ Idioms/Thread-safe Copy-on-write</title>
			<link>https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Thread-safe_Copy-on-write&amp;diff=4295502&amp;oldid=0</link>
			<guid isPermaLink="false">https://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms/Thread-safe_Copy-on-write&amp;diff=4295502&amp;oldid=0</guid>
			<description>&lt;p&gt;added thread safe copy on write article&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=&amp;lt;center&amp;gt;Thread-safe Copy-on-write&amp;lt;/center&amp;gt;=&lt;br /&gt;
=== Intent ===&lt;br /&gt;
Allow concurrent access to shared objects without mutual exclusion on the fast, reading path.&lt;br /&gt;
&lt;br /&gt;
=== Also Known As ===&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
Many applications perform dynamic configuration changes on separate thread causing implementing changes non-trivial. This idiom is an alternative to popular mutual exclusion in situation where reads are common and writes are rare. The reading is fast and relies on always valid shared pointer and the writes first copy the object, then atomically update the pointer.&lt;br /&gt;
&lt;br /&gt;
=== Solution and Sample Code ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;memory&amp;gt;&lt;br /&gt;
#include &amp;lt;atomic&amp;gt;&lt;br /&gt;
#include &amp;lt;thread&amp;gt;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class ThreadSafeCowPtr&lt;br /&gt;
{&lt;br /&gt;
    public:&lt;br /&gt;
        // constructors...&lt;br /&gt;
        &lt;br /&gt;
        RefPtr read() const&lt;br /&gt;
        {&lt;br /&gt;
            return std::atomic_load(&amp;amp;data);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // with mutex it can be called by multiple threads at once&lt;br /&gt;
        void update(new_data T)&lt;br /&gt;
        {&lt;br /&gt;
            std::lock_guard&amp;lt;std::mutex&amp;gt; lock(write_mut);&lt;br /&gt;
            auto new_ptr = std::shared_ptr&amp;lt;std::string&amp;gt;(new T(std::move(new_data)));&lt;br /&gt;
            std::atomic_store(&amp;amp;data, new_ptr);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    private:&lt;br /&gt;
        RefPtr m_sp;     &lt;br /&gt;
        std::mutex write_mut;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mutex would not be required in single consumer, single producer scenario.  &lt;br /&gt;
=== Known Uses ===&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
=== Related Idioms ===&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
* [[wikipedia:Copy-on-write]]&lt;br /&gt;
&lt;br /&gt;
{{BookCat}}&lt;/div&gt;</description>
			<pubDate>Sun, 04 Jun 2023 00:20:22 GMT</pubDate>
			<dc:creator>Dzejmson</dc:creator>
			<comments>https://en.wikibooks.org/wiki/Talk:More_C%2B%2B_Idioms/Thread-safe_Copy-on-write</comments>
		</item>
</channel></rss>