<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Refcountet smartpointer race condition]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe mal eine Frage ich versuche gerade rauszufinden wie der std::shared_ptr&lt;&gt;<br />
funktioniert und im DTOR vom shared ptr wird _Decref() aufgerufen und decref macht das:</p>
<pre><code>void _Decref()
		{	// decrement use count
		if (_MT_DECR(_Mtx, _Uses) == 0)
			{	// destroy managed resource, decrement weak reference count
			_Destroy();
			_Decwref();
			}
		}
</code></pre>
<p>Ist die Abfrage nicht eine Race Condition? Was passiert, wenn nach der Abfrage (_== 0) in einem anderen Thread gerade ein Objekt erstellt wird bevor _Destroy() und _Decwref() aufgerufen wird?<br />
Müsste die Funktion nicht mit einem mutex geschuetzt werden oder wenigsten volatile definiert werden?<br />
Ich bin gerade ein wenig verwirrt, vielleicht kann ja jemand Licht ins Dunkel bringen.</p>
<p>P.S.:Visual Studio 2013</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333943/refcountet-smartpointer-race-condition</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 08:58:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333943.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Aug 2015 11:50:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Refcountet smartpointer race condition on Wed, 12 Aug 2015 11:54:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe mal eine Frage ich versuche gerade rauszufinden wie der std::shared_ptr&lt;&gt;<br />
funktioniert und im DTOR vom shared ptr wird _Decref() aufgerufen und decref macht das:</p>
<pre><code>void _Decref()
		{	// decrement use count
		if (_MT_DECR(_Mtx, _Uses) == 0)
			{	// destroy managed resource, decrement weak reference count
			_Destroy();
			_Decwref();
			}
		}
</code></pre>
<p>Ist die Abfrage nicht eine Race Condition? Was passiert, wenn nach der Abfrage (_== 0) in einem anderen Thread gerade ein Objekt erstellt wird bevor _Destroy() und _Decwref() aufgerufen wird?<br />
Müsste die Funktion nicht mit einem mutex geschuetzt werden oder wenigsten volatile definiert werden?<br />
Ich bin gerade ein wenig verwirrt, vielleicht kann ja jemand Licht ins Dunkel bringen.</p>
<p>P.S.:Visual Studio 2013</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463573</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 12 Aug 2015 11:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Refcountet smartpointer race condition on Wed, 12 Aug 2015 12:02:55 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Ist die Abfrage nicht eine Race Condition? Was passiert, wenn nach der Abfrage (_== 0) in einem anderen Thread gerade ein Objekt erstellt wird bevor _Destroy() und _Decwref() aufgerufen wird?</p>
</blockquote>
<p>Das geht nicht. Wenn du nach _MT_INCR googlest stellst du fest, dass das eine lockfreie Dekrementierung vornimmt. Das hat den Effekt von</p>
<pre><code class="language-cpp">lock()
--Uses;
int the_uses = Uses;
unlock();
if (the_uses==0) {
 _Destroy();
 _Decwref();
}
</code></pre>
<p>Wo soll da ein Objekt erstellt werden können? Vor dem lock ist es egal. Nach dem unlock ist uses==0, was es verbietet, das Objekt zu erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463575</guid><dc:creator><![CDATA[mutex_inkrement]]></dc:creator><pubDate>Wed, 12 Aug 2015 12:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Refcountet smartpointer race condition on Wed, 12 Aug 2015 12:10:02 GMT]]></title><description><![CDATA[<p>mutex_inkrement schrieb:</p>
<blockquote>
<p>Wo soll da ein Objekt erstellt werden können? Vor dem lock ist es egal. Nach dem unlock ist uses==0, was es verbietet, das Objekt zu erstellen.</p>
</blockquote>
<p>Ah, mir war nicht bewusst, das uses==0 eine Konstruktion verhindert, aber macht Sinn, danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463576</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 12 Aug 2015 12:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to Refcountet smartpointer race condition on Wed, 12 Aug 2015 12:39:26 GMT]]></title><description><![CDATA[<p>Noch eine interessante Info warum der weak reference count runtergezählt wird: <a href="https://www.reddit.com/r/cpp/comments/3eia29/stdshared_ptrs_secret_constructor/ctfeh1p" rel="nofollow">https://www.reddit.com/r/cpp/comments/3eia29/stdshared_ptrs_secret_constructor/ctfeh1p</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463577</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 12 Aug 2015 12:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Refcountet smartpointer race condition on Wed, 12 Aug 2015 14:08:18 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>... wenigsten volatile definiert werden?</p>
</blockquote>
<p>volatile hat nichts mit Threads zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463583</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 12 Aug 2015 14:08:18 GMT</pubDate></item></channel></rss>