<?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[Frage zu critical sections]]></title><description><![CDATA[<p>In meinem multi threat Programm wird an einer Stelle ein Unterprogramm aufgerufen, daß bedingt durch die Laufzeit teilweise falsche Daten liefert, weil mehrer Threat das Unterprogramm gleichzeitig aufrufen.</p>
<p>das Unterprogramm sieht so aus:</p>
<pre><code>void Process_Data(int counter){
:
:
:
}
</code></pre>
<p>Aufruf, gnaz klar durch:</p>
<pre><code>Process_Data(counter);
</code></pre>
<p>Wie kann ich das komplette Unterprogramm als critical section laufen lassen, ist das überhaupt sinnvoll? Vom Ablauf meines Programmes her gesehen, wäre es unerheblich, wenn die einzelnen Threats auf dieses Unterprogramm warten müssen, da der zeitaufwendige Teil, (dies war der Grund mehrere Threat zu benutzen) an anderer Stelle geschieht und dieser Teil lediglich im promille Bereich des Threats liegt. Liege ich mit der Überlegung eine critical section zu benutzen eigentlich richtig, oder gibt es bessere/einfachere Lösungsansätze? Ich hoffe hier weis jemand Rat <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/topic/144576/frage-zu-critical-sections</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 19:44:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144576.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Apr 2006 14:54:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 14:54:06 GMT]]></title><description><![CDATA[<p>In meinem multi threat Programm wird an einer Stelle ein Unterprogramm aufgerufen, daß bedingt durch die Laufzeit teilweise falsche Daten liefert, weil mehrer Threat das Unterprogramm gleichzeitig aufrufen.</p>
<p>das Unterprogramm sieht so aus:</p>
<pre><code>void Process_Data(int counter){
:
:
:
}
</code></pre>
<p>Aufruf, gnaz klar durch:</p>
<pre><code>Process_Data(counter);
</code></pre>
<p>Wie kann ich das komplette Unterprogramm als critical section laufen lassen, ist das überhaupt sinnvoll? Vom Ablauf meines Programmes her gesehen, wäre es unerheblich, wenn die einzelnen Threats auf dieses Unterprogramm warten müssen, da der zeitaufwendige Teil, (dies war der Grund mehrere Threat zu benutzen) an anderer Stelle geschieht und dieser Teil lediglich im promille Bereich des Threats liegt. Liege ich mit der Überlegung eine critical section zu benutzen eigentlich richtig, oder gibt es bessere/einfachere Lösungsansätze? Ich hoffe hier weis jemand Rat <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/1040637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040637</guid><dc:creator><![CDATA[Einsteiger]]></dc:creator><pubDate>Wed, 19 Apr 2006 14:54:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 15:35:58 GMT]]></title><description><![CDATA[<p>Critical Sections werden mit der WinAPI erstellt, ich verschieb dich dort mal hin.</p>
<p>Aber wenn die Methode thread-safe sein soll, warum nicht die ganze mit einer CS umspannen?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040674</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 19 Apr 2006 15:35:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 15:37:34 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=2822" rel="nofollow">SideWinder</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=13" rel="nofollow">DOS und Win32-Konsole</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040676</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 19 Apr 2006 15:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 15:38:03 GMT]]></title><description><![CDATA[<p>ja mach einfach den aufruf zu der funktion in eine critical section</p>
<p>[critical section]<br />
unterprogramm()<br />
[/critical section]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040678</guid><dc:creator><![CDATA[WideSinder]]></dc:creator><pubDate>Wed, 19 Apr 2006 15:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 16:09:54 GMT]]></title><description><![CDATA[<p>WideSinder schrieb:</p>
<blockquote>
<p>ja mach einfach den aufruf zu der funktion in eine critical section</p>
<p>[critical section]<br />
unterprogramm()<br />
[/critical section]</p>
</blockquote>
<p>Schön genauso hab ich mir das vorher auch schon ausgedacht, aber ich weis nicht wie ich's schreine soll? Vielleicht so:<br />
Irgendeine Variable &quot;LPCRITICAL_SECTION My_CriticalSection;&quot; definieren<br />
und als code das da ausführen?</p>
<pre><code>EnterCriticalSection(My_CriticalSection);
Process_Data(counter);
LeaveCriticalSection(My_CriticalSection);
</code></pre>
<p>vor dem Starten des ersten Threads noch &quot;InitializeCriticalSection&quot; und beim beenden des letzten Threats noch &quot;DeleteCriticalSection&quot;, darf ich mir das so vorstellen? Jo compilieren läßt sich das Ganze und dann kommt auch schon das nette Popup &quot;Diese Anwendung wird blablabla ungültig mehrbblablablabla !oh!-&gt; geschlossen&quot;. Ja wie gesagt ich habe keinen blassen Schimmer wie ich den Code schreiben soll. Aber auf solch eine triviale Idee wie</p>
<p>[critical section]<br />
unterprogramm()<br />
[/critical section]</p>
<p>bin ich auch schon gekommen, nur mit dem Umsetzen happerts eben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040710</guid><dc:creator><![CDATA[Einsteiger]]></dc:creator><pubDate>Wed, 19 Apr 2006 16:09:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 17:07:52 GMT]]></title><description><![CDATA[<p>so ungefär..</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;
#include &lt;process.h&gt;
#include &lt;math.h&gt;

static int g_wichtig; 
CRITICAL_SECTION cs;

void wichtig( int a )
{
	EnterCriticalSection(&amp;cs);
	g_wichtig += a;
	g_wichtig++;
	LeaveCriticalSection(&amp;cs);
}

void threadfunc_a( void *arg )
{
	while(1)
		wichtig( rand() % 100 );
}

void threadfunc_b( void *arg )
{
	while(1)
		wichtig( rand() % 500 );
}

int main(int argc, char* argv[])
{
	HANDLE handle[2];

	InitializeCriticalSection(&amp;cs);

	handle[0] = (HANDLE) _beginthread( threadfunc_a, 0, NULL );
	handle[1] = (HANDLE) _beginthread( threadfunc_b, 0, NULL );

	WaitForMultipleObjects( 2, handle, TRUE, INFINITE );
	DeleteCriticalSection(&amp;cs);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1040746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040746</guid><dc:creator><![CDATA[fdsdfs]]></dc:creator><pubDate>Wed, 19 Apr 2006 17:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 18:00:04 GMT]]></title><description><![CDATA[<p>Yo das sieht ja mal richtig gut aus, und laufen tut es auch schon, danke schön fdsdfs. Hab zwei Versionen compiliert eine mit dem critical section eintrag eine ohne, die ohne schmeist häufig die Daten durcheinander die andere kein einziges Mal, ich hätte da noch eine Frage, brauche ich diese Zeile unbedingt, natürlich in abgewandelter Form?</p>
<pre><code>WaitForMultipleObjects( 2, handle, TRUE, INFINITE );
</code></pre>
<p>Ich hab zwar den Eintrag dazu in der MSDN gelesen, aber so ganz verstanden für was die Funktion gut ist, hab ich nicht.</p>
<p>Und dann noch:</p>
<pre><code>InitializeCriticalSection(&amp;cs);
</code></pre>
<p>Führe ich das nur ein einziges mal beim Programmstart aus und</p>
<pre><code>DeleteCriticalSection(&amp;cs);
</code></pre>
<p>nur einaml beim Beenden des Programms? Denn in meinem Programm können die Threats, wenn sie beendet wurden auf Tastendruck erneut ausgeführt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040796</guid><dc:creator><![CDATA[Einsteiger]]></dc:creator><pubDate>Wed, 19 Apr 2006 18:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 18:31:35 GMT]]></title><description><![CDATA[<p>Einsteiger schrieb:</p>
<blockquote>
<pre><code>InitializeCriticalSection(&amp;cs);
</code></pre>
<p>Führe ich das nur ein einziges mal beim Programmstart aus und</p>
<pre><code>DeleteCriticalSection(&amp;cs);
</code></pre>
<p>nur einaml beim Beenden des Programms?</p>
</blockquote>
<p>Ganz genau!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040825</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 19 Apr 2006 18:31:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 18:49:54 GMT]]></title><description><![CDATA[<p>Einsteiger schrieb:</p>
<blockquote>
<p>Yo das sieht ja mal richtig gut aus, und laufen tut es auch schon, danke schön fdsdfs. Hab zwei Versionen compiliert eine mit dem critical section eintrag eine ohne, die ohne schmeist häufig die Daten durcheinander die andere kein einziges Mal, ich hätte da noch eine Frage, brauche ich diese Zeile unbedingt, natürlich in abgewandelter Form?</p>
<pre><code>WaitForMultipleObjects( 2, handle, TRUE, INFINITE );
</code></pre>
<p>Ich hab zwar den Eintrag dazu in der MSDN gelesen, aber so ganz verstanden für was die Funktion gut ist, hab ich nicht.</p>
</blockquote>
<p>nee das brauchste ned das war nur damit main() ned gleich returned</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040844</guid><dc:creator><![CDATA[fsdfsd]]></dc:creator><pubDate>Wed, 19 Apr 2006 18:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 20:48:54 GMT]]></title><description><![CDATA[<blockquote>
<p>In meinem multi threat Programm</p>
</blockquote>
<p>Wenn willst Du denn alles bedrohen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040934</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Wed, 19 Apr 2006 20:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Wed, 19 Apr 2006 20:53:06 GMT]]></title><description><![CDATA[<blockquote>
<p>brauche ich diese Zeile unbedingt</p>
</blockquote>
<p>Ja, die brauchst Du, da EnterCriticalSection und LeaveCriticalSection in den Threads sonst u. U. mit einem ungültigen Objekt aufgerufen werden, da dieses bereits mit DeleteCriticalSection zerstört worden sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040936</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Wed, 19 Apr 2006 20:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Thu, 20 Apr 2006 08:32:21 GMT]]></title><description><![CDATA[<p>Ja, aber wenn ich DeleteCriticalSection, so wie der Jochen sagt, erst beim Beenden meines Programmes ausführe, tritt dieses Problem doch gar nicht erst auf, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1041091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1041091</guid><dc:creator><![CDATA[Einsteiger]]></dc:creator><pubDate>Thu, 20 Apr 2006 08:32:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Thu, 20 Apr 2006 09:54:32 GMT]]></title><description><![CDATA[<p>Irgendwann nach der Rückkehr aus der main-function wird die CRT ExitProcess aufrufen. Dabei werden alle Threads dieses Prozesses &quot;gewaltsam&quot; beendet. Dies sollte an sich schon vermieden werden. Bei dem Programmbeispiel ist es allerdings notwendig, da die Sub-Threads sich hier niemals selbst beenden.</p>
<p>WaitForMultipleObjects wartet auf die Beendigung der 2 Sub-Threads. Ohne dieses Abwarten wird die CriticalSection gleich nach Erzeugung der Sub-Threads zerstört. Die Sub-Threads laufen aber unabhängig vom Haupt-Thread weiter. Wird in einem Sub-Thread (vor dessen Zerstörung beim Ende des Prozesses) dann EnterCriticalSection oder LeaveCriticalSection aufgerufen, erfolgt der Aufruf mit einem ungültigen CriticalSection-Object.</p>
<p>Da die Sub-Threads im Beispiel sich allerdings nicht von selbst beenden, wird ein WaitForMultipleObjects hier natürlich für ein endloses Warten sorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1041160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1041160</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Thu, 20 Apr 2006 09:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Thu, 20 Apr 2006 19:09:13 GMT]]></title><description><![CDATA[<p>Äähmmm ja, danke für die Erklärung, hab sie aber nicht so ganz verstanden. Also ich hab den Eintrag</p>
<pre><code>DeleteCriticalSection(&amp;cs);
</code></pre>
<p>unter</p>
<pre><code>case WM_DESTROY:
</code></pre>
<p>eingefügt, ist das ok. Meine Threa<strong>d</strong>s beenden sich eigentlich alle mit ExitThrea<strong>d</strong>.</p>
<p>Hmm, bis jetzt lief mein Proggy auch problemlos, aber man weis ja nie wo der Hund noch überall begraben liegt <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/1041534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1041534</guid><dc:creator><![CDATA[Einsteiger]]></dc:creator><pubDate>Thu, 20 Apr 2006 19:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu critical sections on Fri, 21 Apr 2006 07:35:08 GMT]]></title><description><![CDATA[<p>Einsteiger schrieb:</p>
<blockquote>
<p>Meine Threa<strong>d</strong>s beenden sich eigentlich alle mit ExitThrea<strong>d</strong>.</p>
<p>Hmm, bis jetzt lief mein Proggy auch problemlos, aber man weis ja nie wo der Hund noch überall begraben liegt <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>Überprüfst du auch, daß sich die Threads beendet haben, bevor du dein Programm beendest? Wenn nicht, könntest du auf genau das Problem stoßen, um das es geht - irgendein Hilfsthread krallt sich zwischen dem WM_DESTROY und dem physischen Programmende die gelöschte Critical Section.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1041681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1041681</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 21 Apr 2006 07:35:08 GMT</pubDate></item></channel></rss>