<?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[thread und rvalues]]></title><description><![CDATA[<p>Ich habe eine only-movable Klasse und möchte eine Instanz derer an einen std::thread-Konstruktor übergeben. Momentan ist in der Implementierung von Microsoft noch ein Bug der das leider unmöglich macht. (<a href="http://connect.microsoft.com/VisualStudio/feedback/details/737812" rel="nofollow">http://connect.microsoft.com/VisualStudio/feedback/details/737812</a>)</p>
<p>Läuft schief:</p>
<pre><code>void myfunc(myClass&amp;&amp;);

myClass instance;
std::thread(&amp;myfunc, std::move(instance)).detach();
</code></pre>
<p>Ohne das explizite std::move geht es zwar, aber kopieren ist ja verboten, also meckert der Compiler. Ich bin echt verzweifelt, kennt da jemand einen Hack oder so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326870/thread-und-rvalues</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 14:30:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326870.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jul 2014 21:39:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to thread und rvalues on Thu, 10 Jul 2014 21:39:06 GMT]]></title><description><![CDATA[<p>Ich habe eine only-movable Klasse und möchte eine Instanz derer an einen std::thread-Konstruktor übergeben. Momentan ist in der Implementierung von Microsoft noch ein Bug der das leider unmöglich macht. (<a href="http://connect.microsoft.com/VisualStudio/feedback/details/737812" rel="nofollow">http://connect.microsoft.com/VisualStudio/feedback/details/737812</a>)</p>
<p>Läuft schief:</p>
<pre><code>void myfunc(myClass&amp;&amp;);

myClass instance;
std::thread(&amp;myfunc, std::move(instance)).detach();
</code></pre>
<p>Ohne das explizite std::move geht es zwar, aber kopieren ist ja verboten, also meckert der Compiler. Ich bin echt verzweifelt, kennt da jemand einen Hack oder so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408112</guid><dc:creator><![CDATA[help_fuck_ms]]></dc:creator><pubDate>Thu, 10 Jul 2014 21:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Thu, 10 Jul 2014 21:50:42 GMT]]></title><description><![CDATA[<p>Der Hack ist: lass das &amp;&amp; in der Funktionssignatur weg. Wenn deine Klasse einen Move-Konstruktor hat, wird es dann auch kompilieren (und lies ggf. noch mal etwas über die Move-Semantik).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408116</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 10 Jul 2014 21:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Thu, 10 Jul 2014 21:58:12 GMT]]></title><description><![CDATA[<p>Nein, das funktioniert leider nicht. Der Compiler sagt trotzdem dass versucht wurde auf eine gelöschte Funktion zu verweisen (der Kopierkonstruktor). Ich weiß auch nicht wieso genau das nicht funktioniert, MS hat da halt irgendwas sehr komisch implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408117</guid><dc:creator><![CDATA[help_fuck_ms]]></dc:creator><pubDate>Thu, 10 Jul 2014 21:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 06:36:56 GMT]]></title><description><![CDATA[<p>Kannst Du Dir nicht einen passenden Kopierkonstruktor schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408128</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 11 Jul 2014 06:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 06:37:11 GMT]]></title><description><![CDATA[<p>Ich kann bestätigen, dass VS2013 keine Objekte in Threads moven lässt, weder mit std::thread noch mit std::async. Auf der verlinkten Seite ist ein Workaround angegeben:</p>
<pre><code>void myfunc(std::reference_wrapper&lt;myClass&gt;);

myClass instance;
std::thread(&amp;myfunc, std::ref(instance)).detach();
</code></pre>
<p>Mir ist aber nicht klar, was das für Auswirkungen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408129</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Fri, 11 Jul 2014 06:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 08:36:29 GMT]]></title><description><![CDATA[<p>Normale Referenz übergeben und dann im Thread moven.</p>
<p>help_fuck_ms schrieb:</p>
<blockquote>
<p>MS hat da halt irgendwas sehr komisch implementiert.</p>
</blockquote>
<p>Wohl kaum, move-only-Typen in einen Thread zu bekommen ist verdammt kompliziert, habe ich jedenfalls beim Versuch einer std::thread-Implementation nicht hinbekommen. Wenn man darauf nicht achtet kann man das hingegen mit einem simplen std::bind lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408145</guid><dc:creator><![CDATA[qqq]]></dc:creator><pubDate>Fri, 11 Jul 2014 08:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 09:35:54 GMT]]></title><description><![CDATA[<p>qqq schrieb:</p>
<blockquote>
<p>Normale Referenz übergeben und dann im Thread moven.</p>
</blockquote>
<p>Du willst ja sowas machen können:</p>
<pre><code>void foo(std::vector&lt;T&gt; v){
    thread(bla, std::move(v)).detach();
}
</code></pre>
<p>Bei Referenz übergeben und im Thread moven gibt es den vector vielleicht gar nicht mehr. Also muss man warten, bis der Thread mit dem moven fertig ist und muss Threads synchronisieren, was es zu vermeiden gilt. Man kann den vector einem std::auto_ptr anvertrauen oder etwas was anders heißt und dasselbe tut um den Aufschrei zu vermeiden. Man kann auch &quot;sicher gehen&quot; indem man einen std::shared_ptr mitsamt des Overheads in Kauf nimmt. Alles nicht so richtig schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408154</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Fri, 11 Jul 2014 09:35:54 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 16:36:41 GMT]]></title><description><![CDATA[<p>Also einfach einen shared_ptr auf ein struct thread_arguments oder sowas zu übergeben scheint mir doch die sinnvollste Lösung zu sein diesen VS Bug zu umgehen (der liegt btw nicht unbedingt an der Library, sondern daran dass VS einfach move immer noch nicht vollständig implementiert hat), der Overhead von shared_ptr gegenüber den Kosten einen Thread zu starten ist eh vernachlässigbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408236</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 11 Jul 2014 16:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 21:11:30 GMT]]></title><description><![CDATA[<p>Die schreiben doch selbst dass es an der Library liegt -- weil sie halt std::bind verwenden, was für den Thread-Ctor aber die falsche Semantik hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408269</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 11 Jul 2014 21:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Fri, 11 Jul 2014 21:25:35 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Du willst ja sowas machen können:</p>
<pre><code>void foo(std::vector&lt;T&gt; v){
    thread(bla, std::move(v)).detach();
}
</code></pre>
<p>Bei Referenz übergeben und im Thread moven gibt es den vector vielleicht gar nicht mehr. Also muss man warten, bis der Thread mit dem moven fertig ist und muss Threads synchronisieren, was es zu vermeiden gilt.</p>
</blockquote>
<p>Das Problem gibt es aber nur wenn man es mit <code>std::ref</code> macht, nen? Der obige Code mit <code>std::move</code> sollte mMn. ohne Synchroniserung korrekt funktionieren, da das Objekt <code>v</code> ja erstmal in das Thread-Objekt reingemoved wird, und danach erst der Thread gestartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408272</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 11 Jul 2014 21:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Sat, 12 Jul 2014 00:51:40 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der obige Code mit <code>std::move</code> sollte mMn. ohne Synchroniserung korrekt funktionieren, da das Objekt <code>v</code> ja erstmal in das Thread-Objekt reingemoved wird, und danach erst der Thread gestartet.</p>
</blockquote>
<p>Wenn es kompilieren würde sollte es so funktionieren. Tut es aber nicht in VisualStudio. Der Workaround soll aber genauso gut funktionieren. Ich glaube std::ref hat hier keinerlei Vorteil gegenüber einer normalen Referenz und das ist schlecht. Mein Favorit ist immernoch auto_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408282</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sat, 12 Jul 2014 00:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to thread und rvalues on Sat, 12 Jul 2014 02:41:17 GMT]]></title><description><![CDATA[<p>Jo.</p>
<p>Und... das &quot;in das <code>thread</code> Objekt reingemoved&quot; von mir ist natürlich Unsinn.</p>
<p>Sonst gäbe es ja erst wieder ein Problem wenn das <code>thread</code> Objekt zu früh zerstört wird. <code>std::thread</code> muss intern wohl den Funktor den der Thread dann ausführen soll &quot;dynamisch instanzieren&quot;, und dann Ownership an die Trampolin-Funktion des Thread transferieren.<br />
Die zu bindenden Parameter müssen in diesen dynamisch instanzierten Funktor reingemoved werden, nicht in das <code>std::thread</code> Objekt. Aber halt innerhalb des Konstruktors von <code>std::thread</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408285</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Jul 2014 02:41:17 GMT</pubDate></item></channel></rss>