<?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[Threads die sich selbständig neue Arbeit holen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will meine Anwendung mit mehreren Threads austatten. Aus gründen der Effizienz wollte ich die Threads selbständig arbeiten lassen, d.h. jeder Thread holt sich selbst immer wieder neue Arbeit (er ruft eine Funktion auf, die ein Array ausfüllt) bis es keine mehr gibt. Erst dann soll das Programm sich beenden.</p>
<p>Deklarationen etc.:</p>
<pre><code class="language-cpp">struct WorkItem
{
	char *data;
        bool finished;
};

#define ITEMS_PER_CALL 20
</code></pre>
<p>So starte und beende ich die Threads:</p>
<pre><code class="language-cpp">InitializeCriticalSection(&amp;cs);

	for (int i = 0; i &lt; ThreadCount; i++)
	{
		Threads[i] = CreateThread(NULL, NULL, ThreadFunc, NULL, NULL, NULL);
	}

	WaitForMultipleObjects(ThreadCount, Threads, true, INFINITE);

	DeleteCriticalSection(&amp;cs);
	for (int i = 0; i &lt; ThreadCount; i++)
	{
		CloseHandle(Threads[i]);
		Sleep(20);
	}
</code></pre>
<p>Die Threadfunktion:</p>
<pre><code class="language-cpp">DWORD WINAPI ThreadFunc(LPVOID param)
{
	srand(GetTickCount());
	WorkItem newitems[ITEMS_PER_CALL];

	bool exit = false;
	while (1)
	{
		EnterCriticalSection(&amp;cs);
		GetNewItems(newitems);
		LeaveCriticalSection(&amp;cs);

		for (int i = 0; i &lt; Items_PER_CALL; i++)
		{
			if (newitems[i].finished == true) 
			{
				exit = true;
				break;
			}

			EnterCriticalSection(&amp;cs);
			cout &lt;&lt; &quot;Work-Data: &quot; &lt;&lt; newitems[i].data &lt;&lt; endl;
			LeaveCriticalSection(&amp;cs);
		}

		if (exit)
		{
			return 0;
		}
	}
	return 0;
}
</code></pre>
<p>Das ist die GetNewItems-Funktion:</p>
<pre><code class="language-cpp">void GetNewItems(WorkItem *newitems)
{
	EnterCriticalSection(&amp;cs); // brauch ich das überhaupt hier?
	for (int i = 0; i &lt; ITEMS_PER_CALL; i++)
	{
		if ((CurrItem+1) &gt;= ItemCount) // ItemCount is die gesamt anzahl, CurrItem das gerade verwendete Item
		{
                     newitems[i].finished = true;
		}

		newitems[i].data = data[CurrItem]; //data is ne char** variable
                newitems[i].finished = false;
		CurrItem++;
	}
	LeaveCriticalSection(&amp;cs); //brauch ich das hier?
}
</code></pre>
<p>Also das Problem ist, wenn ich nur 1 Thread nehme, geht alles bestens. Wenn ich aber mehr nehme, dann geht es manchmal, manchmal bricht er nach ein paar Aufträgen ab.</p>
<p>Achja, ich kann die WorkItems nich direkt speichern und zurückgeben, das ganze muss über CurrItem und so gehen.</p>
<p>Weiß jemand woran das liegen könnte?<br />
Gruß pyro</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196916/threads-die-sich-selbständig-neue-arbeit-holen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 02 May 2026 02:17:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196916.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Nov 2007 15:16:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads die sich selbständig neue Arbeit holen? on Sun, 04 Nov 2007 15:16:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will meine Anwendung mit mehreren Threads austatten. Aus gründen der Effizienz wollte ich die Threads selbständig arbeiten lassen, d.h. jeder Thread holt sich selbst immer wieder neue Arbeit (er ruft eine Funktion auf, die ein Array ausfüllt) bis es keine mehr gibt. Erst dann soll das Programm sich beenden.</p>
<p>Deklarationen etc.:</p>
<pre><code class="language-cpp">struct WorkItem
{
	char *data;
        bool finished;
};

#define ITEMS_PER_CALL 20
</code></pre>
<p>So starte und beende ich die Threads:</p>
<pre><code class="language-cpp">InitializeCriticalSection(&amp;cs);

	for (int i = 0; i &lt; ThreadCount; i++)
	{
		Threads[i] = CreateThread(NULL, NULL, ThreadFunc, NULL, NULL, NULL);
	}

	WaitForMultipleObjects(ThreadCount, Threads, true, INFINITE);

	DeleteCriticalSection(&amp;cs);
	for (int i = 0; i &lt; ThreadCount; i++)
	{
		CloseHandle(Threads[i]);
		Sleep(20);
	}
</code></pre>
<p>Die Threadfunktion:</p>
<pre><code class="language-cpp">DWORD WINAPI ThreadFunc(LPVOID param)
{
	srand(GetTickCount());
	WorkItem newitems[ITEMS_PER_CALL];

	bool exit = false;
	while (1)
	{
		EnterCriticalSection(&amp;cs);
		GetNewItems(newitems);
		LeaveCriticalSection(&amp;cs);

		for (int i = 0; i &lt; Items_PER_CALL; i++)
		{
			if (newitems[i].finished == true) 
			{
				exit = true;
				break;
			}

			EnterCriticalSection(&amp;cs);
			cout &lt;&lt; &quot;Work-Data: &quot; &lt;&lt; newitems[i].data &lt;&lt; endl;
			LeaveCriticalSection(&amp;cs);
		}

		if (exit)
		{
			return 0;
		}
	}
	return 0;
}
</code></pre>
<p>Das ist die GetNewItems-Funktion:</p>
<pre><code class="language-cpp">void GetNewItems(WorkItem *newitems)
{
	EnterCriticalSection(&amp;cs); // brauch ich das überhaupt hier?
	for (int i = 0; i &lt; ITEMS_PER_CALL; i++)
	{
		if ((CurrItem+1) &gt;= ItemCount) // ItemCount is die gesamt anzahl, CurrItem das gerade verwendete Item
		{
                     newitems[i].finished = true;
		}

		newitems[i].data = data[CurrItem]; //data is ne char** variable
                newitems[i].finished = false;
		CurrItem++;
	}
	LeaveCriticalSection(&amp;cs); //brauch ich das hier?
}
</code></pre>
<p>Also das Problem ist, wenn ich nur 1 Thread nehme, geht alles bestens. Wenn ich aber mehr nehme, dann geht es manchmal, manchmal bricht er nach ein paar Aufträgen ab.</p>
<p>Achja, ich kann die WorkItems nich direkt speichern und zurückgeben, das ganze muss über CurrItem und so gehen.</p>
<p>Weiß jemand woran das liegen könnte?<br />
Gruß pyro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1397532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1397532</guid><dc:creator><![CDATA[pyromania]]></dc:creator><pubDate>Sun, 04 Nov 2007 15:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Threads die sich selbständig neue Arbeit holen? on Mon, 05 Nov 2007 03:38:31 GMT]]></title><description><![CDATA[<p>Also...</p>
<pre><code class="language-cpp">void GetNewItems(WorkItem *newitems)
{
    EnterCriticalSection(&amp;cs); // brauchst du entweder hier ODER in ThreadFunc (ist aber auch kein Problem wenn es an beiden Stellen steht)
    for (int i = 0; i &lt; ITEMS_PER_CALL; i++)
    {
        if (CurrItem &gt;= ItemCount) // wir markieren Items NACH dem letzten
        {
            newitems[i].finished = true;
            break;
        }

        newitems[i].data = data[CurrItem]; //data is ne char** variable
        newitems[i].finished = false;
        CurrItem++;
    }
    LeaveCriticalSection(&amp;cs); // brauchst du entweder hier ODER in ThreadFunc

}
</code></pre>
<p>Sonst sehe ich auf die Schnelle keinen Fehler.</p>
<p>Es wäre auch hilfreich wenn du den Code posten würdest den du auch verwendest, möglichst ein minimales Beispiel das compilierbar und ausführbar ist, mit dem der Fehler reproduzierbar ist. Der Code den du gepostet hast kann garnicht compilieren (es sei denn &quot;Items_PER_CALL&quot; ist kein Tippfehler sondern du hast wirklich irgendwo &quot;Items_PER_CALL&quot; UND &quot;ITEMS_PER_CALL&quot; definiert).</p>
<p>&quot;Zusammengekürzte&quot; Beispiele haben oft andere Probleme bzw. u.U. kürzt du sogar den Fehler raus, und dann können wir dir nicht helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1397829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1397829</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Nov 2007 03:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Threads die sich selbständig neue Arbeit holen? on Mon, 05 Nov 2007 13:23:46 GMT]]></title><description><![CDATA[<p>Hm ja, sollte natürlich in beiden Fällen ITEMS_PER_THREAD heißen.<br />
Ich hab den Fehler nun glaub ich auch gefunden.<br />
Ich habe nach CreateThread() einfach ein Sleep(10) eingebaut, jetz scheint es ganz gut zu funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398019</guid><dc:creator><![CDATA[pyromania]]></dc:creator><pubDate>Mon, 05 Nov 2007 13:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Threads die sich selbständig neue Arbeit holen? on Mon, 05 Nov 2007 17:49:19 GMT]]></title><description><![CDATA[<p>Den Fehler hast du mit Sleep(10) auf jeden Fall NICHT behoben sondern nur maskiert.<br />
Viel schlimmer gehts eigentlich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398212</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Nov 2007 17:49:19 GMT</pubDate></item></channel></rss>