<?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[std::thread langsam]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>kann mir jemand sagen, warum dieses Programm subjektiv langsam läuft?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;thread&gt;

using namespace std;

void sayHello() {
        cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl;
}

void sayBye() {
        cout &lt;&lt; &quot;Bye&quot; &lt;&lt; endl;
}

int main() {

  thread t(sayHello); 
  thread p(sayBye);
  t.join();
  p.join();
  return 0;
}
</code></pre>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313086/std-thread-langsam</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 08:41:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313086.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Jan 2013 14:55:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 14:55:46 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>kann mir jemand sagen, warum dieses Programm subjektiv langsam läuft?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;thread&gt;

using namespace std;

void sayHello() {
        cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl;
}

void sayBye() {
        cout &lt;&lt; &quot;Bye&quot; &lt;&lt; endl;
}

int main() {

  thread t(sayHello); 
  thread p(sayBye);
  t.join();
  p.join();
  return 0;
}
</code></pre>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291910</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 14:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:01:50 GMT]]></title><description><![CDATA[<p>Weil du mehrere Mikro- oder gar Milisekunden verschwendest, um zwei Threads zu erzeugen und zu synchronisieren, die dann jeweils eine Aufgabe ausführen, die eigentlich in Nanosekunden erledigt wäre. Threads sind keine Zauberei, die dein Programm magisch schneller machen.</p>
<p>Zudem ist der Ausgabestrom von sich aus nicht synchronisiert, du kann bei diesem Programm daher auch leicht irgendwelchen Buchstabensalat als Ausgabe erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291914</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:17:02 GMT]]></title><description><![CDATA[<p>Ok :). Ich stelle mir aber vor, dass es manchmal durchaus Sinn macht, seine Arbeit parallel zu machen.</p>
<p>Warum darf an einen Thread keine Referenz übergebenen werden? Dies funktioniert nur, wenn sie const ist. Ist irgendwie etwas einzuwenden, dass ein Thread eine Variabel ändert? Oder hat man Angst vor dem Erzeuger-Verbraucher-Problem?</p>
<pre><code class="language-cpp">void saySomething(const int&amp; x, const int&amp; y) { //muss const sein!
        cout &lt;&lt; x+y &lt;&lt; endl;
}

int main() {

        int a = 3;
        int b = 8;
        thread t(saySomething,a,b);
        t.join();

        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291918</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:37:12 GMT]]></title><description><![CDATA[<p>Das hat mit Templatemagiee zu tun. Benutze <code>std::ref</code> . Funktioniert wunderbar ohne <code>const</code> .</p>
<blockquote>
<p>subjektiv langsam läuft</p>
</blockquote>
<p>Und das bedeutet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291924</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:47:35 GMT]]></title><description><![CDATA[<p>Dass es mit std::ref funktioniert, habe ich gerade herausgefunden :). Weißt Du auch warum? std::ref nimmt ja nicht mit einer echten Referenz, sondern mit einem Objekt, das recht ähnlich ist.</p>
<p>Subjektiv langsam bedeutet: Auf eine normale Ausgabe muss ich eigentlich warten. Jetzt vergehen etwa 1,5 Sekunden, bis die Ausgabe in meiner Konsole erscheint.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291934</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:55:56 GMT]]></title><description><![CDATA[<p>std::ref nimmt eine echte Referenz.<br />
Es wird dafür benötigt, dass das Template mitbekommt, dass hier jemand per Referenz übergeben will, ansonsten würde er ja jedes Objekt das du da als l-value reinschleust als Referenz mitnehmen und das willst du ja bestimmt nicht.</p>
<p>Edit: Die l-value Sache ist natürlich irgendwie Latte, ansonsten würde er halt auf Ref-To-Const matchen, aber immernoch Ref.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291937</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:56:50 GMT]]></title><description><![CDATA[<blockquote>
<p>1,5 Sekunden</p>
</blockquote>
<p>Sorry, wen ich Strg+F5 druecke, kann ich nicht bis 1 zaehlen. Es ist verdammt fix. Das Problem liegt auf deiner Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291940</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:58:03 GMT]]></title><description><![CDATA[<p>Ich denke, die längste Zeit wird damit verbracht, das Konsolenfenster zu öffnen und dann wieder zu schließen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291941</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:58:48 GMT]]></title><description><![CDATA[<p>Ich arbeite mit einem Netbook (Intel Atom) und ich merke den geringen Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291942</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 15:59:35 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Ich denke, die längste Zeit wird damit verbracht, das Konsolenfenster zu öffnen und dann wieder zu schließen.</p>
</blockquote>
<p>Ich arbeite in der Konsole. Da wird nichts geöffnet oder geschlossen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291943</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 15:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 16:03:06 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ich arbeite in der Konsole. Da wird nichts geöffnet oder geschlossen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Und was sagt time zu deinem Programm? (real, user und sys)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291944</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 21 Jan 2013 16:03:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 16:24:41 GMT]]></title><description><![CDATA[<p>real 0m2.736s<br />
user 0m2.556s<br />
sys 0m0.144s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291950</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 16:24:41 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 16:41:26 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>real 0m2.736s<br />
user 0m2.556s<br />
sys 0m0.144s</p>
</blockquote>
<p>Da ist etwas ganz furchtbar falsch bei dir oder du verschweigst uns den echten Code. Kein Computer auf Transistorbasis auf der Welt, kann für das gezeigte Programm 2.5 Sekunden Userzeit benötigen. Geschweige denn ein halbwegs moderner Prozessor mit Gigaherztakt. Das ist mindestens um einen Faktor 1000 zu langsam. Oder leitest du die Ausgabe durch einen Nadeldrucker? Nein, das würde auch keine Userzeit benötigen, sondern höchstens Echtzeit fressen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>P.S.: Du compilierst das Programm doch nicht jedes Mal neu, oder? Denn Compilieren, Optimieren und Linken braucht auf meinem Rechner ca. 1 Sekunde, das könnten 2.5 Sekunden auf einem Atom sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291958</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 21 Jan 2013 16:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 18:41:33 GMT]]></title><description><![CDATA[<p>Doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Dann liegt hier ein großes Missverständnis vor, das wegen mir entstanden ist. Sorry, hab mich schlecht ausgedrückt! Ich kompiliere jedes Mal neu. Ist std::thread einfach so schwierig in Maschinencode umzusetzen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291998</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Jan 2013 18:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 18:50:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">g++ -std=c++11 -E freaks_programm.cpp | wc -l
</code></pre>
<p>Gibt bei mir 34357 aus. 35k Zeilen zu parsen braucht halt schon etwas Zeit. Das zu Linken geht dann schnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292001</guid><dc:creator><![CDATA[WC]]></dc:creator><pubDate>Mon, 21 Jan 2013 18:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 21:09:31 GMT]]></title><description><![CDATA[<p>Also ging es um die Kompilezeit und nicht um die Laufzeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292055</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 21 Jan 2013 21:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Mon, 21 Jan 2013 21:30:58 GMT]]></title><description><![CDATA[<p>Friedrich Dürrenmatt schrieb:</p>
<blockquote>
<p>Eine Geschichte ist dann zu Ende gedacht, wenn sie ihre schlimmstmögliche Wendung genommen hat</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2292061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292061</guid><dc:creator><![CDATA[litterant]]></dc:creator><pubDate>Mon, 21 Jan 2013 21:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Tue, 22 Jan 2013 10:15:46 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void saySomething(const int&amp; x, const int&amp; y) {
        cout &lt;&lt; x+y &lt;&lt; endl;
}

int main() {
        int a = 3;
        int b = 8;
        thread t(saySomething,a,b);  // &lt;-- hier
        t.join();

        return 0;
}
</code></pre>
</blockquote>
<p>Das &quot;hier&quot; ist ja kein Funktionsaufruf von saySomething. Du teilst lediglich dem Konstruktor, mit welchen Parametern er welche Funktion aufzurufen hat. Und weil der Konstruktoraufruf nur dafür sorgt, dass der Thread gestartet wird, kommt es zur weiteren Ausführung des Haupt-Threads schon <strong>bevor</strong> der neue Thread fertig wird. Ich denke, das ist klar. Aber ich betone das extra nochmal, um zu erklären, wie gefährlich es wäre, wenn das Thread-Objekt sich nur Referenzen merken würde. Beispiel:</p>
<pre><code class="language-cpp">void foo(const int&amp; x)
{
  pause(123);
  cout &lt;&lt; x &lt;&lt; endl;
}

int main()
{
  thread t (foo, 3+4);
  t.join();
}
</code></pre>
<p>Worauf soll sich x beziehen? Aus 3+4 wird ein temporäres Objekt, dessen Referenz an den Thread-Konstruktor geht. Das temporäre Objekt ist beim Semikolon aber wieder verschwunden. x darf sich also nicht auf dieses temporäre Objekt beziehen, weil es ja schon nicht mehr da ist, wenn in foo die Ausgabe stattfindet.</p>
<p>Der Thread-Konstruktor behandelt seine Argumente tatsächlich ähnlich wie std::make_tuple. Sie werden kopiert, es sei denn, man hat std::ref oder std::cref verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292162</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 22 Jan 2013 10:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Tue, 22 Jan 2013 13:44:36 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Der Thread-Konstruktor behandelt seine Argumente tatsächlich ähnlich wie std::make_tuple. Sie werden kopiert, es sei denn, man hat std::ref oder std::cref verwendet.</p>
</blockquote>
<p>Wenn man es ganz genau nimmt, werden auch die std::ref/cref Rückgaben kopiert - die Kopie eines reference_wrapper ist aber wenig spektakulär, nämlich auch nur eine Referenz auf das selbe Objekt <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/2292275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292275</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Jan 2013 13:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread langsam on Tue, 22 Jan 2013 14:47:34 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wenn man es ganz genau nimmt, werden auch die std::ref/cref Rückgaben kopiert</p>
</blockquote>
<p>Das kommt echt auf die Implementierung an, ob diese Dinger kopiert werden oder nicht. Für reference_wrapper machen tuple/make_tuple und thread::thread eine Sonderbehandlung. Beispielsweise liefert make_tuple(cref(&quot;x&quot;[0])) ein tuple&lt;const char&amp;&gt; zurück. Für die std::thread Implementierung würde ich wahrscheinlich einfach std::make_tuple benutzen:</p>
<pre><code class="language-cpp">template&lt;class Fun, class...Args&gt;
thread::thread(Fun&amp;&amp; f, Args&amp;&amp;...args)
{
  typedef decltype(make_tuple(declval&lt;Fun&gt;(),declval&lt;Args&gt;()...)) tuple_type;
  unique_ptr&lt;tuple_type&gt; up (new tuple_type(forward&lt;Fun&gt;(fun),forward&lt;Args&gt;(args)...));
  if (thread anstossen mit up.get() erfolgreich)
    up.release();
}
</code></pre>
<p>und mir den Kram dann auch in so einem Tuple merken, so dass man das dann über</p>
<pre><code class="language-cpp">template&lt;int...IntSequence&gt;
struct int_sequence{};

template&lt;class TupleType, class IntSequence&gt;
struct trampoline;
template&lt;class TupleType, int...Indices&gt;
struct trampoline&lt;TupleType,int_sequence&lt;Indices...&gt;&gt;
{
  static void func(void* context)
  {
    unique_ptr&lt;TupleType&gt; up (static_cast&lt;TupleType*&gt;(context));
    std::get&lt;0&gt;(move(*up))(
      std::get&lt;Indices&gt;(move(*up))...
    );
  }
}:
</code></pre>
<p>im eigentlichen Thread ausführen kann.</p>
<p>oder so ähnlich mit noch ein bisschen try/catch und Fehlerbehandlung drum herum.</p>
<p>BTW: Wenn ich mich da nicht vertan habe, ist <code>get&lt;Index&gt;(move(tuple))</code> äquivalent zu <code>forward&lt;tuple_element&lt;tupletype,Index&gt;::type&gt;(get&lt;Index&gt;(tuple))</code> . Ersteres ist natürlich leichter aufzuschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2292299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2292299</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 22 Jan 2013 14:47:34 GMT</pubDate></item></channel></rss>