<?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[Implementierung parallel_for Gut&#x2F;Schlecht]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>da ich auf Anhieb nicht viel zur Implementierung einer &quot;parallel_for&quot; Funktion gefunden habe, habe ich mich daran gemacht selbst eine zu erstellen. Nun würde ich gerne von euch wissen ob diese so wie sie ist brauchbar ist oder Fehler enthält die sich später rechen könnten.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;functional&gt;
#include &lt;mutex&gt;

using namespace std;

template &lt;typename T, typename funcT&gt;
void parallel_for(T start, T end, size_t maxThreads, funcT func)
{
	vector&lt;thread&gt; threads;
	T position = start;
	mutex positionMutex;

	auto workerFunction = [&amp;](){
		while (position &lt; end)
		{
			positionMutex.lock();
			int number = position;
			position++;
			positionMutex.unlock();

			func(number);
		}
	};

	for (size_t threadCount = 0; threadCount &lt; maxThreads; threadCount++)
	{
		threads.push_back(thread(workerFunction));
	}

	for (size_t threadIndex = 0; threadIndex &lt; threads.size(); threadIndex++)
	{
		threads.at(threadIndex).join();
	}
}
</code></pre>
<p>Aufgerufen wird sie z.B. so:</p>
<pre><code>parallel_for(0, 8, 8, [](int i){
		this_thread::sleep_for(chrono::milliseconds(1000));
		cout &lt;&lt; &quot;Nr &quot; &lt;&lt; i &lt;&lt; &quot; ist fertig.\n&quot;;
	});
</code></pre>
<p>Gruß wolfsberger</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329491/implementierung-parallel_for-gut-schlecht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Jul 2026 03:56:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329491.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Nov 2014 12:06:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 12:06:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>da ich auf Anhieb nicht viel zur Implementierung einer &quot;parallel_for&quot; Funktion gefunden habe, habe ich mich daran gemacht selbst eine zu erstellen. Nun würde ich gerne von euch wissen ob diese so wie sie ist brauchbar ist oder Fehler enthält die sich später rechen könnten.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;functional&gt;
#include &lt;mutex&gt;

using namespace std;

template &lt;typename T, typename funcT&gt;
void parallel_for(T start, T end, size_t maxThreads, funcT func)
{
	vector&lt;thread&gt; threads;
	T position = start;
	mutex positionMutex;

	auto workerFunction = [&amp;](){
		while (position &lt; end)
		{
			positionMutex.lock();
			int number = position;
			position++;
			positionMutex.unlock();

			func(number);
		}
	};

	for (size_t threadCount = 0; threadCount &lt; maxThreads; threadCount++)
	{
		threads.push_back(thread(workerFunction));
	}

	for (size_t threadIndex = 0; threadIndex &lt; threads.size(); threadIndex++)
	{
		threads.at(threadIndex).join();
	}
}
</code></pre>
<p>Aufgerufen wird sie z.B. so:</p>
<pre><code>parallel_for(0, 8, 8, [](int i){
		this_thread::sleep_for(chrono::milliseconds(1000));
		cout &lt;&lt; &quot;Nr &quot; &lt;&lt; i &lt;&lt; &quot; ist fertig.\n&quot;;
	});
</code></pre>
<p>Gruß wolfsberger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429468</guid><dc:creator><![CDATA[wolfsberger]]></dc:creator><pubDate>Tue, 25 Nov 2014 12:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 13:06:40 GMT]]></title><description><![CDATA[<p>Threads in einer parallel_for-Funktion zu starten und wieder zu beenden ist wohl nicht wirklich sinnvoll. Threads sind teuer.</p>
<p>Da <a href="https://www.threadingbuildingblocks.org/" rel="nofollow">https://www.threadingbuildingblocks.org/</a> gibts eine brauchbare Implementierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429475</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 25 Nov 2014 13:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 13:19:49 GMT]]></title><description><![CDATA[<p>Danke, das sieht sehr interessant aus, es scheint genau das zu sein was ich gesucht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429480</guid><dc:creator><![CDATA[wolfsberger]]></dc:creator><pubDate>Tue, 25 Nov 2014 13:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 13:38:40 GMT]]></title><description><![CDATA[<p>(mit windows) geht auch:</p>
<pre><code>#include &lt;ppl.h&gt;

using namespace concurrency;

...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429483</guid><dc:creator><![CDATA[asdfasdf]]></dc:creator><pubDate>Tue, 25 Nov 2014 13:38:40 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 13:46:50 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Threads in einer parallel_for-Funktion zu starten und wieder zu beenden ist wohl nicht wirklich sinnvoll. Threads sind teuer.</p>
</blockquote>
<p>+1<br />
Man sollte vielleicht dazusagen: Threads erzeugen bzw. joinen ist teuer. Threads grundsätzlich sind nicht teuer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>@wolfsberger<br />
Also...</p>
<pre><code class="language-cpp">while (position &lt; end)
        {
            positionMutex.lock();
            int number = position;
            position++;
            positionMutex.unlock();

            func(number);
        }
</code></pre>
<ul>
<li><code>while (position &lt; end)</code> ist ne Race-Condition, da nicht synchronisiert<br />
* Lock+Unlock einer Mutex pro Schleifendurchlauf wäre für kurze &quot;func&quot; sehr schlecht, würde massiv Performance kosten</li>
</ul>
<p>Besser ist es den einzelnen Threads Blöcke von zusammenhängenden Nummern zuzuweisen. Der Trick dabei ist es hinzubekommen dass man keinem Thread zu viel gibt. Weil ja nicht jeder Aufruf von func() gleich lange dauern wird. Man denke bloss man an Apfelmännchen Zeichnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429486</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Nov 2014 13:46:50 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 15:15:36 GMT]]></title><description><![CDATA[<p>BTW, deine schleifen laufen nur bis Maxthreads. Da muesste dann noch eine schleife drum, die bis end laeuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429509</guid><dc:creator><![CDATA[asdfasdf]]></dc:creator><pubDate>Tue, 25 Nov 2014 15:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 19:33:37 GMT]]></title><description><![CDATA[<p>Ja, die Threads-Erzeuge und Threads-Joine-Schleifen sollen ja auch nur bis MaxThreads laufen.<br />
Guggstdu in Lambda das <code>while (position &lt; end)</code> wenn du die andere Schleife suchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429557</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Nov 2014 19:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 19:55:58 GMT]]></title><description><![CDATA[<p>Stimmt. Me &lt;- blind</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429569</guid><dc:creator><![CDATA[Asdfasdf]]></dc:creator><pubDate>Tue, 25 Nov 2014 19:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 20:14:04 GMT]]></title><description><![CDATA[<p>Welcome to the club <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429572</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Nov 2014 20:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung parallel_for Gut&#x2F;Schlecht on Tue, 25 Nov 2014 20:50:54 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Welcome to the club <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Lol <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429577</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 25 Nov 2014 20:50:54 GMT</pubDate></item></channel></rss>