<?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[Problem mit critical Section]]></title><description><![CDATA[<p>Hallo, ich habe 2 Threads. Ein Produzenten und einen Konsumenten.</p>
<p>Der Produzent soll die produzierten Objekte in eine Queue legen und der Konzument soll sich diese abholen.</p>
<p>Nun habe ich versucht eine Thread sichere queue zu schreiben:</p>
<pre><code class="language-cpp">#include &lt;queue&gt;

using namespace std; 

#ifndef Queue_Thread_sicher__ 
#define Queue_Thread_sicher__ 

template&lt;class T&gt; class Queue_Thread_sicher

{
private:
	CRITICAL_SECTION CriSect;
	queue&lt;T&gt; *q;

public:

	//Konstruktor
	Queue_Thread_sicher() 
	{
		q= new queue&lt;T&gt;();
		InitializeCriticalSection(&amp;CriSect);
	}

	//Destruktor
	~Queue_Thread_sicher() 
	{
		DeleteCriticalSection(&amp;CriSect);
		delete q;
	}

	//liefern den Wert des letzten Elements .
	T back () 
		{	 
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;back();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//gibt zurück, ob die queue leer ist
	bool empty()
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;empty();
		LeaveCriticalSection(&amp;CriSect);	
	}

	//liefern den Wert des ersten Elements .
	T front () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;front();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//löscht das letzte element
	void pop () 
	{	
		EnterCriticalSection(&amp;CriSect);
			q-&gt;pop();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//Fügt ein Element hinzu
	void push (T t) 
	{
		EnterCriticalSection(&amp;CriSect);
			q-&gt;push(t);
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//gibt die Größe an
	float zize () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;size();
		LeaveCriticalSection(&amp;CriSect) ;	
	}
};

#endif
</code></pre>
<p>Das Problem ist aber, dass der Produzent ein Objekt produzieren und in die Queue legen kann. Der Konsument nimmt sich diese raus und &quot;verbraucht&quot; es.<br />
Dann kann der Produzent aber keine weiteren Objekte in die Queue legen, denn er bekommt (anscheinend) keinen Zugriff auf die critical Section.</p>
<p>Immer wenn ich dann das Programm unterbreche hängt er in der schleife, bei der er (Der produzent) auf den Zugang zur critical Section wartet.</p>
<p>Was ist Falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160155/problem-mit-critical-section</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 06:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160155.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Sep 2006 13:19:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 13:19:57 GMT]]></title><description><![CDATA[<p>Hallo, ich habe 2 Threads. Ein Produzenten und einen Konsumenten.</p>
<p>Der Produzent soll die produzierten Objekte in eine Queue legen und der Konzument soll sich diese abholen.</p>
<p>Nun habe ich versucht eine Thread sichere queue zu schreiben:</p>
<pre><code class="language-cpp">#include &lt;queue&gt;

using namespace std; 

#ifndef Queue_Thread_sicher__ 
#define Queue_Thread_sicher__ 

template&lt;class T&gt; class Queue_Thread_sicher

{
private:
	CRITICAL_SECTION CriSect;
	queue&lt;T&gt; *q;

public:

	//Konstruktor
	Queue_Thread_sicher() 
	{
		q= new queue&lt;T&gt;();
		InitializeCriticalSection(&amp;CriSect);
	}

	//Destruktor
	~Queue_Thread_sicher() 
	{
		DeleteCriticalSection(&amp;CriSect);
		delete q;
	}

	//liefern den Wert des letzten Elements .
	T back () 
		{	 
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;back();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//gibt zurück, ob die queue leer ist
	bool empty()
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;empty();
		LeaveCriticalSection(&amp;CriSect);	
	}

	//liefern den Wert des ersten Elements .
	T front () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;front();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//löscht das letzte element
	void pop () 
	{	
		EnterCriticalSection(&amp;CriSect);
			q-&gt;pop();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//Fügt ein Element hinzu
	void push (T t) 
	{
		EnterCriticalSection(&amp;CriSect);
			q-&gt;push(t);
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//gibt die Größe an
	float zize () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;size();
		LeaveCriticalSection(&amp;CriSect) ;	
	}
};

#endif
</code></pre>
<p>Das Problem ist aber, dass der Produzent ein Objekt produzieren und in die Queue legen kann. Der Konsument nimmt sich diese raus und &quot;verbraucht&quot; es.<br />
Dann kann der Produzent aber keine weiteren Objekte in die Queue legen, denn er bekommt (anscheinend) keinen Zugriff auf die critical Section.</p>
<p>Immer wenn ich dann das Programm unterbreche hängt er in der schleife, bei der er (Der produzent) auf den Zugang zur critical Section wartet.</p>
<p>Was ist Falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142555</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 13:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:03:58 GMT]]></title><description><![CDATA[<p>Hier noch der Code zum Testen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;winsock2.h&gt;
#include &quot;Queue_Thread_sicher.h&quot;
using namespace std; 

DWORD WINAPI Produzent(LPVOID data)
{
	//data in Queue_Thread_sicher umwandeln
	Queue_Thread_sicher&lt;int*&gt; *q = (Queue_Thread_sicher&lt;int*&gt;*) data; 

	while (true) {			//produziere für immer

		int *x = new int (700);	//erzeuge integer zahl
		q-&gt;push(x);			//Füge diese in die Queue_Thread ein
		cout &lt;&lt; *x&lt;&lt;&quot; produziert&quot;&lt;&lt; endl;

	}
	return (DWORD)data;
}

DWORD WINAPI Konsument(LPVOID data)
{
	//data in Queue_Thread_sicher umwandeln
	Queue_Thread_sicher&lt;int*&gt; *q = (Queue_Thread_sicher&lt;int*&gt;*) data;

	while (true) {			//konsumiere für immer
		while (!q-&gt;empty())     //wenn die queue nicht leer ist
		{

				int *x=q-&gt;back();  //hole Element aus der Queue

			cout &lt;&lt; *x&lt;&lt;&quot; konsumiert&quot;&lt;&lt; endl;
			delete x;			//lösche das Objekt
			q-&gt;pop();			//Reduziere die Queue um 1

		}
	}
	return (DWORD)data;
}

int main () {
	//die Threadsichere Queue erzeugen
	Queue_Thread_sicher&lt;int*&gt; *q = new Queue_Thread_sicher&lt;int*&gt;();
	HANDLE hThread[2];	//Handle für die Threads
	DWORD  dwThreadID[2];	//DWORD für die Threads

//Beide Threads starten
	hThread[0] = CreateThread(NULL,                        
		0,                            
		Produzent,           
		(LPVOID)q,           
		0,                            
		&amp;dwThreadID[0]);

	hThread[1] = CreateThread(NULL,                        
		0,                            
		Konsument,           
		(LPVOID)q,           
		0,                            
		&amp;dwThreadID[1]);

	//Auf die Threads warten
	WaitForMultipleObjects(	2,	
		hThread,			
		TRUE,				
		INFINITE);		

	return 1;
}
</code></pre>
<p>Als Ausgabe erscheint nur:</p>
<blockquote>
<p>700produziert 700konsumiert</p>
</blockquote>
<p>und dann nichts mehr.</p>
<p>Wie musß ich die Klasse &quot;Queue_Thread_sicher&quot; ändern, damit es funktioniert?<br />
(Oder ist woanders ein Fehler?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142604</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:07:52 GMT]]></title><description><![CDATA[<p>MisterX schrieb:</p>
<blockquote>
<pre><code>float zize () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;size();
		LeaveCriticalSection(&amp;CriSect) ;	
	}
</code></pre>
</blockquote>
<p>Ist dir klar, was hier <em>nicht</em> passiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142606</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:23:51 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>MisterX schrieb:</p>
<blockquote>
<pre><code>float zize () 
	{
		EnterCriticalSection(&amp;CriSect);
			return q-&gt;size();
		LeaveCriticalSection(&amp;CriSect) ;	
	}
</code></pre>
</blockquote>
<p>Ist dir klar, was hier <em>nicht</em> passiert?</p>
</blockquote>
<p>Leider nein!<br />
Bitte schreib was nicht passiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142614</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:23:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:26:52 GMT]]></title><description><![CDATA[<p>LeaveCriticalSection passiert nicht. Nach der return-Anweisung ist die Methode beendet.</p>
<p>Edit: Gerade erst gesehen: Warum in aller Welt <em>float</em>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142616</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:28:58 GMT]]></title><description><![CDATA[<p>LoooooL &lt;Brett vorm Kopf zur seite schieb&gt; &lt;schäm&gt;</p>
<p>Ich frage mich dann nur, warum ich ein Element produzieren und eins kosumieren konnte, wenn ich nie die critical Section freigebe.<br />
Es hätte nach dem Produzieren doch der Konsument keinen Eintritt mehr bekommen dürfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142620</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:31:18 GMT]]></title><description><![CDATA[<p>Warum float?</p>
<p>Habe ich mich auch gewundert, aber bei den ganzzahligen typen int, long,<br />
unsigned int, unsigned long, schreibt er immer als Warnung, dass Datenverlußte<br />
auftreten könnten, bei float schreibt der Compiler die warnung nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142622</guid><dc:creator><![CDATA[Misterx]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:32:32 GMT]]></title><description><![CDATA[<p>MisterX schrieb:</p>
<blockquote>
<p>Es hätte nach dem Produzieren doch der Konsument keinen Eintritt mehr bekommen dürfen.</p>
</blockquote>
<p>Nö. In push hast du das Problem ja nicht.</p>
<p>Dein Code ist übrigens ein gutes Beispiel für nicht exception-sicheren Code. Warum die Klasse einen Zeiger für die Queue verwendet, habe ich auch nicht verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142624</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:39:51 GMT]]></title><description><![CDATA[<p>So, DANKE nochmals<br />
(Manchmal sieht man die Bäume vor lauter Wald nicht)</p>
<p>Hier die jetzt funktionierende Version (leider noch ohne Exception Handling)</p>
<pre><code class="language-cpp">#include &lt;queue&gt;
using namespace std; 

#ifndef Queue_Thread_sicher__ 
#define Queue_Thread_sicher__ 

template&lt;class T&gt; class Queue_Thread_sicher

{
private:
	CRITICAL_SECTION CriSect;
	queue&lt;T&gt; q;

public:

	//Konstruktor
	Queue_Thread_sicher() 
	{

		InitializeCriticalSection(&amp;CriSect);
	}

	//Destruktor
	~Queue_Thread_sicher() 
	{
		DeleteCriticalSection(&amp;CriSect);

	}

	//liefern den Wert des letzten Elements .
	T back () 
		{	 
		EnterCriticalSection(&amp;CriSect);
		T help=q.back();
		LeaveCriticalSection(&amp;CriSect) ;
		return help;
	}

	//gibt zurück, ob die queue leer ist
	bool empty()
	{
		EnterCriticalSection(&amp;CriSect);
		bool help= q.empty();
		LeaveCriticalSection(&amp;CriSect);
		return help;
	}

	//liefern den Wert des ersten Elements .
	T front () 
	{
		EnterCriticalSection(&amp;CriSect);
		T help=q.front();
		LeaveCriticalSection(&amp;CriSect) ;
		return help;
	}

	//löscht das letzte element
	void pop () 
	{	
		EnterCriticalSection(&amp;CriSect);
			q.pop();
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//Fügt ein Element hinzu
	void push (T t) 
	{
		EnterCriticalSection(&amp;CriSect);
			q.push(t);
		LeaveCriticalSection(&amp;CriSect) ;	
	}

	//gibt die Größe an
	float zize () 
	{
		EnterCriticalSection(&amp;CriSect);
		float f= q.size();
		LeaveCriticalSection(&amp;CriSect) ;	
		return f;
	}
};

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1142632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142632</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:39:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:41:35 GMT]]></title><description><![CDATA[<p>Oh man bin ich dumm. <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="😃"
    /> Ich werde mich nochmal mit den Grundlagen beschäftigen bevor ich mit Winapi weitermache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1142633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142633</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit critical Section on Fri, 22 Sep 2006 14:48:10 GMT]]></title><description><![CDATA[<p>Obwohl du unter falschem Namen postest, ist die Idee gar nicht mal so schlecht <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/1142635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1142635</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Fri, 22 Sep 2006 14:48:10 GMT</pubDate></item></channel></rss>