<?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[Task based concurrency]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich befolge grade die Tutorial Serie von Bartosz Milewski zum Thema Concurrency und habe eine Frage zum Task based Ansatz mit Async. Der vollständigkeit halber hier einmal der Link: <a href="https://www.youtube.com/watch?v=_Ll0PIobErE" rel="nofollow">https://www.youtube.com/watch?v=_Ll0PIobErE</a>, 15te minute.</p>
<p>Mein Quellcode sieht genauso aus, wie bei ihm, wenn ich mein Programm aber ausführe, werden alle Tasks in dem main Thread ausgeführt. Bei ihm werden die ersten 6 Tasks in unterschiedlichen threads ausgeführt und nur die übrigen 4 anschließend im main thread.</p>
<p>Ich habe das Programm auf einer Maschine mit 4 Cores ausgeführt und alle tasks wurden sequenziell auf dem main thread abgearbeitet. Daher wollte ich mal nachfragen, woran das liegt und ob ich doch etwas falsch gemacht habe.</p>
<p>Hier ist der Code von mir und dem Tutorial:</p>
<pre><code>int main() {

	std::cout &lt;&lt; &quot;main thread: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; std::endl;

	std::vector&lt;std::future&lt;void&gt;&gt; futures;
	for (int i = 0; i != 10; ++i) {
		auto fut = std::async([] {
			std::this_thread::sleep_for(std::chrono::seconds(2));
			std::cout &lt;&lt; &quot;thread id: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; std::endl;
		});

		futures.push_back(std::move(fut));
	}

	std::for_each(futures.begin(), futures.end(), [](std::future&lt;void&gt; &amp;f){
		f.wait();
	});

	std::cout &lt;&lt; std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(10));

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/334544/task-based-concurrency</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 15:01:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334544.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Sep 2015 17:56:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Task based concurrency on Mon, 21 Sep 2015 17:56:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich befolge grade die Tutorial Serie von Bartosz Milewski zum Thema Concurrency und habe eine Frage zum Task based Ansatz mit Async. Der vollständigkeit halber hier einmal der Link: <a href="https://www.youtube.com/watch?v=_Ll0PIobErE" rel="nofollow">https://www.youtube.com/watch?v=_Ll0PIobErE</a>, 15te minute.</p>
<p>Mein Quellcode sieht genauso aus, wie bei ihm, wenn ich mein Programm aber ausführe, werden alle Tasks in dem main Thread ausgeführt. Bei ihm werden die ersten 6 Tasks in unterschiedlichen threads ausgeführt und nur die übrigen 4 anschließend im main thread.</p>
<p>Ich habe das Programm auf einer Maschine mit 4 Cores ausgeführt und alle tasks wurden sequenziell auf dem main thread abgearbeitet. Daher wollte ich mal nachfragen, woran das liegt und ob ich doch etwas falsch gemacht habe.</p>
<p>Hier ist der Code von mir und dem Tutorial:</p>
<pre><code>int main() {

	std::cout &lt;&lt; &quot;main thread: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; std::endl;

	std::vector&lt;std::future&lt;void&gt;&gt; futures;
	for (int i = 0; i != 10; ++i) {
		auto fut = std::async([] {
			std::this_thread::sleep_for(std::chrono::seconds(2));
			std::cout &lt;&lt; &quot;thread id: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; std::endl;
		});

		futures.push_back(std::move(fut));
	}

	std::for_each(futures.begin(), futures.end(), [](std::future&lt;void&gt; &amp;f){
		f.wait();
	});

	std::cout &lt;&lt; std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(10));

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2468656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468656</guid><dc:creator><![CDATA[Async]]></dc:creator><pubDate>Mon, 21 Sep 2015 17:56:08 GMT</pubDate></item><item><title><![CDATA[Reply to Task based concurrency on Mon, 21 Sep 2015 18:20:06 GMT]]></title><description><![CDATA[<p><a href="http://en.cppreference.com/w/cpp/thread/async" rel="nofollow"> <code>std::async</code> </a>hat auch einen Overload der die Launch Policy angibt. Du hast den ohne explizite Policy Angabe gewählt:</p>
<blockquote>
<p>Behaves the same as <code>async(std::launch::async | std::launch::deferred, f, args...)</code> . <strong>In other words, <code>f</code> may be executed in another thread or it may be run synchronously when the resulting <code>std::future</code> is queried for a value.</strong></p>
</blockquote>
<p>Du möchtest wohl nur <code>std::launch::async</code> angeben, damit tatsächlich ein neuer Thread zur Ausführung verwendet wird.</p>
<pre><code>auto fut = std::async(std::launch::async, [] {
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::cout &lt;&lt; &quot;thread id: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; std::endl;
        });
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2468658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468658</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 21 Sep 2015 18:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Task based concurrency on Wed, 23 Sep 2015 11:24:27 GMT]]></title><description><![CDATA[<p>Hallo Arcoth,</p>
<p>vielen Dank für deine Antwort. Ich hab noch eine weitere Frage dazu: Wovon hängt es denn ab, ob ein Task in einem separatem Thread ausgeführt wird oder im main thread, wenn ich keine run policy übergebe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468859</guid><dc:creator><![CDATA[Async]]></dc:creator><pubDate>Wed, 23 Sep 2015 11:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to Task based concurrency on Wed, 23 Sep 2015 14:21:02 GMT]]></title><description><![CDATA[<p>Async schrieb:</p>
<blockquote>
<p>Hallo Arcoth,</p>
<p>vielen Dank für deine Antwort. Ich hab noch eine weitere Frage dazu: Wovon hängt es denn ab, ob ein Task in einem separatem Thread ausgeführt wird oder im main thread, wenn ich keine run policy übergebe?</p>
</blockquote>
<p>Hängt laut CPP-Reference von der Implementationm der STL ab.</p>
<p><strong>If both the std::launch::async and std::launch::deferred flags are set in policy, it is up to the implementation whether to perform asynchronous execution or lazy evaluation.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468878</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 23 Sep 2015 14:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Task based concurrency on Wed, 23 Sep 2015 15:36:17 GMT]]></title><description><![CDATA[<p>Der Sinn davon ist, dass die Implementierung selber entscheiden können soll, was in einer Situation effizienter ist. Kann der Compiler beispielsweise erkennen, dass die Funktion kaum Zeit benötigen wird, kann er sie bei <code>deferred</code> direkt zum <code>get</code> verschieben.</p>
<p>Das kann er auch machen, wenn ein Thread auf N Futures wartet: Er erzeugt (N-1) zusätzliche Threads und erledigt die übrig gebliebene Aufgabe im Thread, der ansonsten nur warten würde.</p>
<p>In generischem Code ist das sinnvoll, wenn die Art der Arbeit noch nicht abzusehen ist. Ob das ein Compiler bzw eine Standardbibliothek so kompliziert umsetzt, ist eine andere Frage.</p>
<p><code>async</code> ist wie eine Annotation, die dem Compiler eine Zusatzinformation liefert. Wenn <code>if</code> eine räumliche Verzweigung ist, ist <code>async</code> eine zeitliche: &quot;Dieser Funktionsaufruf ist zeitlich unabhängig von den Statements danach&quot;. Was sich verzweigt, muss irgendwann wieder zusammengeführt werden. <code>future</code> modelliert die nicht abgeschlossene Verzweigung, die man mit <code>get</code> abschließen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468889</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 23 Sep 2015 15:36:17 GMT</pubDate></item></channel></rss>