<?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[VC++11 std::thread Fehler?]]></title><description><![CDATA[<p>Mir ist aufgefallen, dass ein Funktionsobjekt, welches von einer Basisklasse erbt, in einem Thread ausgeführt, den falschen operator() aufruft, obwohl er überschrieben wurde.</p>
<p>Folgender Code reproduziert den unerwarteten Effekt.<br />
Ich nehme an, dass das nicht so gewollt ist.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;mutex&gt;
#include &lt;typeinfo&gt;

std::mutex StreamMutex;

class Base {
public:
	virtual void operator()() {
		std::lock_guard &lt;std::mutex&gt; Lock(StreamMutex);
		std::cout &lt;&lt; &quot;Base&quot; &lt;&lt; std::endl;
	}
};

class Derived : public Base {
public:
	void operator()() override {
		std::lock_guard &lt;std::mutex&gt; Lock(StreamMutex);
		std::cout &lt;&lt; &quot;Derived&quot; &lt;&lt; std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Base* Instance = new Derived();
	std::cout &lt;&lt; typeid(*Instance).name() &lt;&lt; std::endl;
	(*Instance)();
	std::thread Thr(*Instance);
	Thr.join();
	std::cin.get();
	return 0;
}
</code></pre>
<p>EDIT: Die Ausgabe:</p>
<blockquote>
<p>class Derived<br />
Derived<br />
Base</p>
</blockquote>
<p>Oder mache ich einen Fehler?<br />
Mir fällt kein Workarond ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301870/vc-11-std-thread-fehler</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 17:24:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301870.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2012 13:39:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:41:03 GMT]]></title><description><![CDATA[<p>Mir ist aufgefallen, dass ein Funktionsobjekt, welches von einer Basisklasse erbt, in einem Thread ausgeführt, den falschen operator() aufruft, obwohl er überschrieben wurde.</p>
<p>Folgender Code reproduziert den unerwarteten Effekt.<br />
Ich nehme an, dass das nicht so gewollt ist.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;mutex&gt;
#include &lt;typeinfo&gt;

std::mutex StreamMutex;

class Base {
public:
	virtual void operator()() {
		std::lock_guard &lt;std::mutex&gt; Lock(StreamMutex);
		std::cout &lt;&lt; &quot;Base&quot; &lt;&lt; std::endl;
	}
};

class Derived : public Base {
public:
	void operator()() override {
		std::lock_guard &lt;std::mutex&gt; Lock(StreamMutex);
		std::cout &lt;&lt; &quot;Derived&quot; &lt;&lt; std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Base* Instance = new Derived();
	std::cout &lt;&lt; typeid(*Instance).name() &lt;&lt; std::endl;
	(*Instance)();
	std::thread Thr(*Instance);
	Thr.join();
	std::cin.get();
	return 0;
}
</code></pre>
<p>EDIT: Die Ausgabe:</p>
<blockquote>
<p>class Derived<br />
Derived<br />
Base</p>
</blockquote>
<p>Oder mache ich einen Fehler?<br />
Mir fällt kein Workarond ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199047</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:45:20 GMT]]></title><description><![CDATA[<p>Functors werden kopiert und sind stateless - polymorphes verhalten und state muss gepimpelt werden.</p>
<p>PS:<br />
was ich damit meine: ein functor ist dumm und kann nicht polymorph verwendet werden, weil er immer kopiert wird (und nicht per ref genommen). auch darf er keinen state haben.</p>
<p>Deshalb kann man ihm als member einen zeiger auf die eigentliche polymorphe implementierung geben - und der op() leitet dann immer an den polymorphen code weiter. So kann auch state abgebildet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199050</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:46:18 GMT]]></title><description><![CDATA[<p>Davon erinnere ich mich gelesen zu haben. *Buch rauskram*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199054</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:48:00 GMT]]></title><description><![CDATA[<p>Du kopierst das Objekt, das ist nachher einfach kein Derived mehr. Ändere zu</p>
<pre><code class="language-cpp">std::thread Thr(std::ref(*Instance));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2199056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199056</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:53:25 GMT]]></title><description><![CDATA[<p>Sorry war etwas zu vc lästig..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199058</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 15:08:14 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25760">@cooky451</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199059</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 05 Apr 2012 15:08:14 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 13:52:30 GMT]]></title><description><![CDATA[<p>probier mal:</p>
<pre><code class="language-cpp">std::thread Thr(std::ref(*Instance) );
</code></pre>
<p>Funktioniert bei mir.</p>
<p>EDIT: Da war cooky451 schneller <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199060</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 14:27:57 GMT]]></title><description><![CDATA[<p>Solche realen Fälle sind gut für die Aufnahme in die FAQ!</p>
<p>Habe nämlich bisher nie den Sinn für std::ref gesehen, trotz Literatur. Aber dieses Topic hat mein Wissen bereichert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199090</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 15:02:40 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Solche realen Fälle sind gut für die Aufnahme in die FAQ!</p>
<p>Habe nämlich bisher nie den Sinn für std::ref gesehen, trotz Literatur. Aber dieses Topic hat mein Wissen bereichert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Ich mag std::ref hier deshalb nicht, weil es so zu leicht ist falschen Code zu schreiben. Denn ein functor ist immer trivial kopierbar - wenn man jetzt hier einen functor hat der anders ist, dann ist es viel zu leicht den doch irgendwo zu kopieren und bämm -&gt; fehlerhafter Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199108</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 05 Apr 2012 15:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Thu, 05 Apr 2012 15:09:22 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Solche realen Fälle sind gut für die Aufnahme in die FAQ!</p>
<p>Habe nämlich bisher nie den Sinn für std::ref gesehen, trotz Literatur. Aber dieses Topic hat mein Wissen bereichert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Man braucht es auch hier:</p>
<pre><code class="language-cpp">std::uniform_real_distribution&lt;double&gt; dist(-200, 200);
        auto gen = std::bind(dist, Engine::random_number_engine);
        std::generate(values.begin(), values.end(), std::ref(gen) )
</code></pre>
<p>Sonst wird jedes mal die selbe Folge von Zufallszahlen generiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199110</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 05 Apr 2012 15:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Fri, 06 Apr 2012 16:16:26 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ich mag std::ref hier deshalb nicht, weil es so zu leicht ist falschen Code zu schreiben. Denn ein functor ist immer trivial kopierbar - wenn man jetzt hier einen functor hat der anders ist, dann ist es viel zu leicht den doch irgendwo zu kopieren und bämm -&gt; fehlerhafter Code.</p>
</blockquote>
<pre><code class="language-cpp">std::thread Thr([=]{(*Instance)();});
</code></pre>
<p>geht auch (glaub'ich) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199398</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 06 Apr 2012 16:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to VC++11 std::thread Fehler? on Fri, 06 Apr 2012 16:19:00 GMT]]></title><description><![CDATA[<p>Geht auch mit static_cast, aber man sollte sich bewusst sein, dass das eine völlig andere Bedeutung hat. (Einmal hat man eine Referenz, und einmal wird kopiert.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199399</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 06 Apr 2012 16:19:00 GMT</pubDate></item></channel></rss>