<?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::threads in richtiger Reihenfolge?]]></title><description><![CDATA[<p>Hallo,</p>
<p>angenommen ich habe mehrere threads die etwas erledigen, mich interessiert aber immer nur das Ergebnis des zuletzt gestarteten (also des &quot;aktuellsten&quot;) threads.</p>
<p>Also wie im unterem Beispiel-Code: Es werden 10 threads der Reihe nach gestartet. Dabei gibt der Parameter i der thread-Funktion die &quot;Aktualität&quot; des threads an: Je höher i, desto &quot;neuer&quot;.</p>
<p>Ist ein thread fertig, soll er sein Ergebnis ausgeben, aber nur wenn ihm nicht ein aktuellerer thread zuvorgekommen ist.</p>
<p>Ist die hier verwendete Methode gut/dafür geeignet?</p>
<p>Ein potenzielles Problem was ich sehe ist das i bzw. highest_i irgendwann überlaufen kann wenn man jetzt keine feste Anzahl an threads erzeugt, sondern über einen längeren Zeitraum hinweg. Das kann man zwar durch Verwendung von long long anstatt int hinauszögern, aber wirklich sauber ist das ja nicht, oder?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;string&gt;
#include &lt;mutex&gt;

std::mutex m;
int highest_i = -1;

void output_something(int i)
{
	std::lock_guard&lt;std::mutex&gt; lock(m);
	if (i &gt; highest_i) // Output only if thread was &quot;newer&quot;
	{
		highest_i = i;
		std::cout &lt;&lt; i &lt;&lt; '\n';
	}
}

void foo(int i)
{
	std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Do some work
	output_something(i);
}

int main()
{
	for (int i = 0; i &lt; 10; ++i)
	{
		std::thread t(foo, i);
		t.detach();
	}
	std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Ensure all threads are finished (Hack for this example)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/332453/std-threads-in-richtiger-reihenfolge</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 03:45:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332453.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 May 2015 20:37:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Fri, 01 May 2015 20:40:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>angenommen ich habe mehrere threads die etwas erledigen, mich interessiert aber immer nur das Ergebnis des zuletzt gestarteten (also des &quot;aktuellsten&quot;) threads.</p>
<p>Also wie im unterem Beispiel-Code: Es werden 10 threads der Reihe nach gestartet. Dabei gibt der Parameter i der thread-Funktion die &quot;Aktualität&quot; des threads an: Je höher i, desto &quot;neuer&quot;.</p>
<p>Ist ein thread fertig, soll er sein Ergebnis ausgeben, aber nur wenn ihm nicht ein aktuellerer thread zuvorgekommen ist.</p>
<p>Ist die hier verwendete Methode gut/dafür geeignet?</p>
<p>Ein potenzielles Problem was ich sehe ist das i bzw. highest_i irgendwann überlaufen kann wenn man jetzt keine feste Anzahl an threads erzeugt, sondern über einen längeren Zeitraum hinweg. Das kann man zwar durch Verwendung von long long anstatt int hinauszögern, aber wirklich sauber ist das ja nicht, oder?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;string&gt;
#include &lt;mutex&gt;

std::mutex m;
int highest_i = -1;

void output_something(int i)
{
	std::lock_guard&lt;std::mutex&gt; lock(m);
	if (i &gt; highest_i) // Output only if thread was &quot;newer&quot;
	{
		highest_i = i;
		std::cout &lt;&lt; i &lt;&lt; '\n';
	}
}

void foo(int i)
{
	std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Do some work
	output_something(i);
}

int main()
{
	for (int i = 0; i &lt; 10; ++i)
	{
		std::thread t(foo, i);
		t.detach();
	}
	std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Ensure all threads are finished (Hack for this example)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2452248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452248</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 01 May 2015 20:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 08:32:54 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Ist die hier verwendete Methode gut/dafür geeignet?</p>
</blockquote>
<p>Nein, besser wäre es, einfach 9 auszugehen.<br />
Das Programm ist völlig sinnlos, aber die geteilten Daten werden korrekt mit einem Mutex geschützt.</p>
<p>Du scheinst etwas ganz tolles vorzuhaben, verrätst aber nicht, was. Daher mein allgemeiner Rat: schau dir TBB an, das kann es wahrscheinlich besser als du.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452264</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 02 May 2015 08:32:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 11:24:51 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Nein, besser wäre es, einfach 9 auszugehen.</p>
</blockquote>
<p><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="😕"
    /><br />
Das wäre dann vom Verhalten aber nicht äquivalent. Das Program gibt nicht nur 9 aus.</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Das Programm ist völlig sinnlos, aber die geteilten Daten werden korrekt mit einem Mutex geschützt.</p>
<p>Du scheinst etwas ganz tolles vorzuhaben, verrätst aber nicht, was. Daher mein allgemeiner Rat: schau dir TBB an, das kann es wahrscheinlich besser als du.</p>
</blockquote>
<p>Also ich will keine eigene <code>parallel_for</code> Schleife oder so implementieren (TBB kenn ich schon)...</p>
<p>Ich will folgendes: Der Benutzer soll eine relativ teure Berechnung zu einem beliebigen Zeitpunkt (in einer GUI, aber das sollte nicht relevant sein) starten können. Angenommen der Benutzer startet jetzt eine neue Berechnung <em>bevor</em> die vorherige Berechnung angeschlossen ist und diese neue Berechnung ist schneller fertig als die alte, dann ist das Ergebnis der vorherigen Berechnung nicht mehr interessant, da nicht mehr aktuell. Nur das aktuellste Ergebnis ist von Belangen.</p>
<p>Natürlich könnte ich auch die ältere Berechnung in dem seperaten thread zuerst kontrolliert abbrechen, bevor ich die neue Berechnung starte. Dann hab ich aber das Problem dass der Benutzer das Beenden der Berechnung durch immer neue Eingaben beliebig verzögern kann, was auch nicht sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452270</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 02 May 2015 11:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 12:28:03 GMT]]></title><description><![CDATA[<p>Merk Dir die ID des zuletzt gestarteten Threads und ignorier die Ergebnisse der anderen.</p>
<p>Das ist aber wirklich nicht ansatzweise schoen, du solltest die alten threads abbrechen oder generell nur einen 'berechnungsthread' haben der dann bei Bedarf 'resetet' wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452274</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Sat, 02 May 2015 12:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 13:48:08 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Merk Dir die ID des zuletzt gestarteten Threads und ignorier die Ergebnisse der anderen.</p>
</blockquote>
<p>Ok stimmt, das ist schonmal wesentlich besser als ein Zähler. <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>
<p>Ruvi schrieb:</p>
<blockquote>
<p>Das ist aber wirklich nicht ansatzweise schoen, du solltest die alten threads abbrechen oder generell nur einen 'berechnungsthread' haben der dann bei Bedarf 'resetet' wird.</p>
</blockquote>
<p>Ja, das Problem mit dem reseten ist halt, dass dann eventuell nie eine Berechnung abgeschlossen wird wenn der Benutzer kontinuierlich neue Anforderungen stellt.</p>
<pre><code>Anfrage 1
&lt;---------------&gt;X
            Anfrage 2
     &lt;---------------------&gt;
                          Anfrage 3
                     &lt;-----------------&gt; etc.
</code></pre>
<p>Hier wird nie etwas fertig, da der aktuelle thread immer beim starten einer neuen Anfrage abgebrochen wird. Er sollte aber noch fertig laufen, da die neue Anfrage ja noch nicht fertig ist.</p>
<p>Zum Zeitpunkt x (in der &quot;Grafik&quot; als X markiert) ist die erste Anfrage fertig und deren Ergebnis soll jetzt verwendet werden, da die neue Anfrage zwar schon läuft, aber eben noch nicht fertig ist.</p>
<p>Ich hoffe das ist verständlich so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452280</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 02 May 2015 13:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 14:22:23 GMT]]></title><description><![CDATA[<p>Ganz ehrlich, das ist ein sehr konstruiertes Problem und da ist der Nutzer dann selber schuld.</p>
<p>Ausserdem hast Du das selbe Problem, mit deinem anderen Loesungsansatz.</p>
<p>Thread1 -----&gt; (Ergebnis wird ignoriert da nicht last thread)<br />
Thread2 -----&gt; (Ergebnis wird ignoriert da nicht last thread<br />
Thread3-/--&gt; (Ergebnis wird ignoriert da nicht last thread)<br />
etc...</p>
<p>Du wirst ja irgendeine Art von GUI haben und in diesem GUI musst Du fuer den Nutzer ja irgendeine visuelle &quot;Markierung&quot; haben, dass gerade im Hintergrund etwas arbeitet und das die Aktion die er gerade gestartet hat nicht sofort beantwortet wird.</p>
<p>Der Nutzer will ja irgendein Ergebnis und falls er merkt er hat etwas falsche Eingegeben und will es korrigieren, interessiert Ihn nicht das Ergebnis der Anfrage die er abgebrochen hat.<br />
Es macht also keinen Sinn den anderen Thread weiter arbeiten zu lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452281</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Sat, 02 May 2015 14:22:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 14:33:14 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Nein, besser wäre es, einfach 9 auszugehen.</p>
</blockquote>
<p><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="😕"
    /><br />
Das wäre dann vom Verhalten aber nicht äquivalent. Das Program gibt nicht nur 9 aus.</p>
</blockquote>
<p>Es liefert das von dir gewünschte Ergebnis schneller und mit gerigerem Resourcenverbrauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452282</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 02 May 2015 14:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sat, 02 May 2015 14:36:31 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<pre><code>Anfrage 1
&lt;---------------&gt;X
            Anfrage 2
     &lt;---------------------&gt;
                          Anfrage 3
                     &lt;-----------------&gt; etc.
</code></pre>
<p>Hier wird nie etwas fertig, da der aktuelle thread immer beim starten einer neuen Anfrage abgebrochen wird. Er sollte aber noch fertig laufen, da die neue Anfrage ja noch nicht fertig ist.</p>
</blockquote>
<p>Welchen Sinn hat das veraltete Ergebnis dann?<br />
Wenn du keinen Thread abbrichst, kann der Benutzer hunderte starten (vielleicht weil er glaubt, dass nichts passiert). Dann wird er erst recht kein Ergebnis erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452284</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 02 May 2015 14:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::threads in richtiger Reihenfolge? on Sun, 03 May 2015 17:22:42 GMT]]></title><description><![CDATA[<p>Hm, hab das alles noch mal durchgedacht und ihr habt wohl recht... macht insgesamt nicht so viel Sinn was ich da vorhatte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Aber trotzdem Danke für die Diskussion <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/2452374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452374</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 03 May 2015 17:22:42 GMT</pubDate></item></channel></rss>