<?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 synchronisieren(criticalSection)]]></title><description><![CDATA[<p>Hallo,</p>
<p>vorweg:<br />
Kann mir gut vorstellen, dass sowas schon x-mal da war, aber die<br />
Suche nach &quot;thread&quot; liefert genau einen Treffer, und der ist unbrauchbar.</p>
<p>Über Google hab ich noch das hier gefunden:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-284835.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-284835.html</a><br />
aber leider funktioniert's nicht so, wie ich's mir vorstelle:</p>
<p>Vorkenntnisse über Threads: NULL</p>
<p>kleines Testprogramm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;

using namespace std;

class cSection
{
public:
	cSection()
	{
	InitializeCriticalSection(&amp;m_criticalSection);
	EnterCriticalSection(&amp;m_criticalSection);
	}

	~cSection()
	{LeaveCriticalSection(&amp;m_criticalSection);}

private:
	CRITICAL_SECTION m_criticalSection;
};

//////////////////////////////////////////////

DWORD WINAPI ThreadProc(LPVOID lpParameter);

//////////////////////////////////////////////

int main()
{
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

	for (int i = 0; i &lt; 10; i++)
	{
	cSection cs;

	cout&lt;&lt;&quot;in main(): &quot;&lt;&lt;i&lt;&lt;endl;
	cout.flush();	
	Sleep(500);
	}

WaitForSingleObject(hThread, INFINITE);

return 0;
}

//////////////////////////////////////////////

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
	for (int i = 0; i &lt; 10; i++)
	{
	cSection cs;

	cout&lt;&lt;&quot;im Thread: &quot;&lt;&lt;i&lt;&lt;endl;
	cout.flush();

	Sleep(1000);
	}

return 0;
}
</code></pre>
<p>Warum wird die Ausgabe vermischt?<br />
Hab ich den Sinn von CriticalSection falsch verstanden?</p>
<pre><code class="language-cpp">in main(): 0
im Thread: 0
in main(): 1
imin main(): 2 Thread: 1

in main(): 3
im Thrinead: 2
 main(): 4
in main(): 5
im Thread:in main(): 3
 6
in main(): 7
im Thread: 4
in main(): 8
in main(): 9
im Thread: 5
im Thread: 6
im Thread: 7
im Thread: 8
im Thread: 9
</code></pre>
<p>thx<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/123455/threads-synchronisieren-criticalsection</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 19:10:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123455.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Oct 2005 09:23:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads synchronisieren(criticalSection) on Mon, 17 Oct 2005 09:25:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vorweg:<br />
Kann mir gut vorstellen, dass sowas schon x-mal da war, aber die<br />
Suche nach &quot;thread&quot; liefert genau einen Treffer, und der ist unbrauchbar.</p>
<p>Über Google hab ich noch das hier gefunden:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-284835.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-284835.html</a><br />
aber leider funktioniert's nicht so, wie ich's mir vorstelle:</p>
<p>Vorkenntnisse über Threads: NULL</p>
<p>kleines Testprogramm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;

using namespace std;

class cSection
{
public:
	cSection()
	{
	InitializeCriticalSection(&amp;m_criticalSection);
	EnterCriticalSection(&amp;m_criticalSection);
	}

	~cSection()
	{LeaveCriticalSection(&amp;m_criticalSection);}

private:
	CRITICAL_SECTION m_criticalSection;
};

//////////////////////////////////////////////

DWORD WINAPI ThreadProc(LPVOID lpParameter);

//////////////////////////////////////////////

int main()
{
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

	for (int i = 0; i &lt; 10; i++)
	{
	cSection cs;

	cout&lt;&lt;&quot;in main(): &quot;&lt;&lt;i&lt;&lt;endl;
	cout.flush();	
	Sleep(500);
	}

WaitForSingleObject(hThread, INFINITE);

return 0;
}

//////////////////////////////////////////////

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
	for (int i = 0; i &lt; 10; i++)
	{
	cSection cs;

	cout&lt;&lt;&quot;im Thread: &quot;&lt;&lt;i&lt;&lt;endl;
	cout.flush();

	Sleep(1000);
	}

return 0;
}
</code></pre>
<p>Warum wird die Ausgabe vermischt?<br />
Hab ich den Sinn von CriticalSection falsch verstanden?</p>
<pre><code class="language-cpp">in main(): 0
im Thread: 0
in main(): 1
imin main(): 2 Thread: 1

in main(): 3
im Thrinead: 2
 main(): 4
in main(): 5
im Thread:in main(): 3
 6
in main(): 7
im Thread: 4
in main(): 8
in main(): 9
im Thread: 5
im Thread: 6
im Thread: 7
im Thread: 8
im Thread: 9
</code></pre>
<p>thx<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/893935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/893935</guid><dc:creator><![CDATA[anonymus]]></dc:creator><pubDate>Mon, 17 Oct 2005 09:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Threads synchronisieren(criticalSection) on Mon, 17 Oct 2005 09:25:09 GMT]]></title><description><![CDATA[<p>Es sollte nur einmal in deinem Programm InitializeCriticalSection aufgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/893937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/893937</guid><dc:creator><![CDATA[erster hinweis]]></dc:creator><pubDate>Mon, 17 Oct 2005 09:25:09 GMT</pubDate></item><item><title><![CDATA[Reply to Threads synchronisieren(criticalSection) on Mon, 17 Oct 2005 12:59:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main()
{
    HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

    for (int i = 0; i &lt; 10; i++)
    {
    cSection cs;
</code></pre>
<pre><code class="language-cpp">DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    for (int i = 0; i &lt; 10; i++)
    {
    cSection cs;
</code></pre>
<p>Dein problem :<br />
main::cs hat nix zu tun mit ThreadProc::cs du lockst also 2 mal 2 voellig unterschiedliche sectionen ...</p>
<p>LockObjecte, also das was du versuchst mit deiner cSection klasse zu bauen, also Objecte die beim automatischen destruieren das Object wieder freigeben, werden meist so gebaut, das sie nen Object zum Locken im Construktor bekommmen !</p>
<p>Besser also waere sowas:</p>
<pre><code class="language-cpp">class SimpleCriticalSection
{
public:
    SimpleCriticalSection()
    {
        ::InitializeCriticalSection(&amp;m_cs);
    }
    ~SimpleCriticalSection()
    {
        ::DeleteCriticalSection(&amp;m_cs);
    }
    void Lock()
    {
        ::EnterCriticalSection(&amp;m_cs);
    }
    void Unlock()
    {
        ::LeaveCriticalSection(&amp;m_cs);
    }
private:
    CRITICAL_SECTION m_cs;
};

template&lt;class CriticalSectionT = SimpleCriticalSection&gt;
class LockObject
{
public:
    LockObject(CriticalSectionT &amp; rxcs):
    mrxcs(rxcs)
    {
        mrxcs.Lock();
    }
    ~LockObject()
    {
        mrxcs.Unlock();
    }
private:
    CriticalSectionT &amp; mrxcs;
};
</code></pre>
<p>Angewendet:</p>
<pre><code class="language-cpp">int main()
{
    SimpleCriticalSection mcs;
    HANDLE hThread = CreateThread(NULL, 0, ThreadProc, &amp;mcs, 0, NULL); // CS als parameter uebergeben ! 

    for (int i = 0; i &lt; 10; i++)
    {
        LockObject&lt;SimpleCriticalSection&gt; LockObj(mcs); 

        cout&lt;&lt;&quot;in main(): &quot;&lt;&lt;i&lt;&lt;endl;
        cout.flush();   
        Sleep(500);
    }

WaitForSingleObject(hThread, INFINITE);

return 0;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    SimpleCriticalSection * pcs = reinterpret_cast&lt;SimpleCriticalSection *&gt;(lpParameter);
    for (int i = 0; i &lt; 10; i++)
    {
    LockObject&lt;SimpleCriticalSection&gt; LockObj(* pcs);

    cout&lt;&lt;&quot;im Thread: &quot;&lt;&lt;i&lt;&lt;endl;
    cout.flush();

    Sleep(1000);
    }

return 0;
}
</code></pre>
<p>Sind bestimmt noch viele fehler drinnen, aber Prinzip sollte ok sein ! <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>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894115</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 17 Oct 2005 12:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Threads synchronisieren(criticalSection) on Mon, 17 Oct 2005 13:13:48 GMT]]></title><description><![CDATA[<p>Danke schön,<br />
jetzt läuft's wunderbar *freu*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894130</guid><dc:creator><![CDATA[anonymus]]></dc:creator><pubDate>Mon, 17 Oct 2005 13:13:48 GMT</pubDate></item></channel></rss>