<?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[Thread Synchronisation]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

int main()
{	
	HANDLE hThread[MAX_THREADS];			
	DWORD  dwThreadID[MAX_THREADS];		

	int ThreadPara = 2;

	int a = 1;
	int *p = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p, 0, &amp;dwThreadID[i]);

	while(true)
	{
		*p != 0 ? *p = 0 : *p = 1;
		Sleep(2000);
	}

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	int *p = (int*) data;

	while(1)
	{
		if(*p != 0)
		{	
			cout &lt;&lt; &quot;ich bin 1&quot; &lt;&lt; endl;
			Sleep(1000);
		}

		else
		{
			cout &lt;&lt; &quot;ich bin 0&quot; &lt;&lt; endl;
			Sleep(1000);
		}
	}

	return ((DWORD) data);
}
</code></pre>
<p>hi,<br />
folgendes problem:<br />
die ausgabe ist nicht korrekt, ich kann mir auch schon denken woran es liegt.<br />
die threads sind nicht synchronisiert. da liegt aber auch mein problem, nach code beispielen die kommentiert sind, hab ich schon im netz gesucht, leider ist das ergebnis mager ausgefallen. ausser das tutorial von <a href="http://www.codeworx.org" rel="nofollow">www.codeworx.org</a> konnte mir einen kleinen einblick verschaffen.<br />
jedoch ist auch das codeworx tutorial dürftig. deshalb frage ich euch, ob ihr mir helfen könnt zb den obigen code thread safe zu programmieren, mir vielleicht unterstützung geben, da die threadprogrammierung zur zeit ein wichtiges thema für mich ist.</p>
<p>gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/75613/thread-synchronisation</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 01:08:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/75613.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Jun 2004 14:48:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread Synchronisation on Wed, 02 Jun 2004 14:48:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

int main()
{	
	HANDLE hThread[MAX_THREADS];			
	DWORD  dwThreadID[MAX_THREADS];		

	int ThreadPara = 2;

	int a = 1;
	int *p = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p, 0, &amp;dwThreadID[i]);

	while(true)
	{
		*p != 0 ? *p = 0 : *p = 1;
		Sleep(2000);
	}

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	int *p = (int*) data;

	while(1)
	{
		if(*p != 0)
		{	
			cout &lt;&lt; &quot;ich bin 1&quot; &lt;&lt; endl;
			Sleep(1000);
		}

		else
		{
			cout &lt;&lt; &quot;ich bin 0&quot; &lt;&lt; endl;
			Sleep(1000);
		}
	}

	return ((DWORD) data);
}
</code></pre>
<p>hi,<br />
folgendes problem:<br />
die ausgabe ist nicht korrekt, ich kann mir auch schon denken woran es liegt.<br />
die threads sind nicht synchronisiert. da liegt aber auch mein problem, nach code beispielen die kommentiert sind, hab ich schon im netz gesucht, leider ist das ergebnis mager ausgefallen. ausser das tutorial von <a href="http://www.codeworx.org" rel="nofollow">www.codeworx.org</a> konnte mir einen kleinen einblick verschaffen.<br />
jedoch ist auch das codeworx tutorial dürftig. deshalb frage ich euch, ob ihr mir helfen könnt zb den obigen code thread safe zu programmieren, mir vielleicht unterstützung geben, da die threadprogrammierung zur zeit ein wichtiges thema für mich ist.</p>
<p>gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/531684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/531684</guid><dc:creator><![CDATA[xerxes]]></dc:creator><pubDate>Wed, 02 Jun 2004 14:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Wed, 02 Jun 2004 17:05:02 GMT]]></title><description><![CDATA[<p>Wenn Du bereit bist, etwas Geld zu investieren, kann ich Dir nur den Richter ans Herz legen. Da wird das bis zum Abwinken durchgekaut...</p>
<p><a href="https://duckduckgo.com/?q=isbn+3860636154&amp;cppnetbooks" rel="nofollow">Microsoft Windows Programmierung für Experten | ISBN: 3860636154</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/531807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/531807</guid><dc:creator><![CDATA[Hepi]]></dc:creator><pubDate>Wed, 02 Jun 2004 17:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Wed, 02 Jun 2004 17:20:20 GMT]]></title><description><![CDATA[<p>was ist denn in deinen augen ne korrekte ausgabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/531821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/531821</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Wed, 02 Jun 2004 17:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Wed, 02 Jun 2004 17:39:05 GMT]]></title><description><![CDATA[<p>guten abend</p>
<p>Hepi schrieb:</p>
<blockquote>
<p>Wenn Du bereit bist, etwas Geld zu investieren, kann ich Dir nur den Richter ans Herz legen. Da wird das bis zum Abwinken durchgekaut...</p>
</blockquote>
<p>das wollte ich mir schon kaufen, doch 100€ bei amazon ist mir doch etwas zu viel<br />
das würde mein budget nicht mitmachen, vielleicht sollte ich mal meinen chef fragen, der könnte es finanzieren <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>CMatt schrieb:</p>
<blockquote>
<p>was ist denn in deinen augen ne korrekte ausgabe?</p>
</blockquote>
<p>folgendes:<br />
die ausgabe heisst &quot;ich bin 1&quot; oder &quot;ich bin 0&quot;<br />
es kommt vor das zb &quot;iiiiccch bbbiiin 1111&quot; ausgegeben wird. das ist schlicht weg falsch. die ausgabe mag zwar richtig sprich die threads geben immer &quot;ich bin 1&quot; oder &quot;ich bin 0&quot; aus. doch am ende kommt manchmal eben so eine mischung raus <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="🙂"
    /><br />
das habe ich mit falscher ausgabe definiert</p>
<p>gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/531833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/531833</guid><dc:creator><![CDATA[xerxes]]></dc:creator><pubDate>Wed, 02 Jun 2004 17:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Wed, 02 Jun 2004 18:17:46 GMT]]></title><description><![CDATA[<p>cout ist nicht threadfest. na, und?<br />
einfach ne critsect drum und gut.<br />
siehe EnterCriticalSection in deiner lieblings-online-hilfe.</p>
<p>bau ne globale critsect namens coutCritsect und mach immer vor cout&lt;&lt;bla ein entern und danach ein leaven.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/531878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/531878</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 02 Jun 2004 18:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Fri, 04 Jun 2004 07:32:50 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;winbase.h&gt;

//#pragma comment(lib, &quot;coremain.lib&quot;)

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

int main()
{	
	HANDLE hThread[MAX_THREADS];			// Handles auf die Threads
	DWORD  dwThreadID[MAX_THREADS];		// IDs der Threads

	int ThreadPara = 2;

	int a = 1;
	int *p = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p, 0, &amp;dwThreadID[i]);

	cout &lt;&lt; &quot;Threads gestartet...&quot; &lt;&lt; endl;

	while(true)
	{
		*p != 0 ? *p = 0 : *p = 1;
		Sleep(2000);
	}

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	CRITICAL_SECTION csMyCriticalSection;

	int *p = (int*) data;

	while(1)
	{
		if(*p != 0)
		{	
			EnterCriticalSection (&amp;csMyCriticalSection);
			cout &lt;&lt; &quot;ich bin 1&quot; &lt;&lt; endl;
			LeaveCriticalSection (&amp;csMyCriticalSection);
			Sleep(1000);
		}

		else
		{
			EnterCriticalSection (&amp;csMyCriticalSection);
			cout &lt;&lt; &quot;ich bin 0&quot; &lt;&lt; endl;
			LeaveCriticalSection (&amp;csMyCriticalSection);
			Sleep(1000);
		}
	}

	DeleteCriticalSection(&amp;csMyCriticalSection);

	return ((DWORD) data);
}
</code></pre>
<p>nach dem ausführen wird nur &quot;Threads gestartet...&quot; ausgeben und dann erscheint nichts mehr. hab ich den kritischen abschnitt richtig angewandt?</p>
<p>gruß xerxes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/532865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/532865</guid><dc:creator><![CDATA[xerxes]]></dc:creator><pubDate>Fri, 04 Jun 2004 07:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Fri, 04 Jun 2004 08:24:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;winbase.h&gt;

//#pragma comment(lib, &quot;coremain.lib&quot;)

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);
void EnterSection(void);
void LeaveSection(void);

// mutex: false entspricht Section ist frei
// mutex: true entspricht Section ist vergeben
bool Mutex = false;

int main()
{	
	HANDLE hThread[MAX_THREADS];			// Handles auf die Threads
	DWORD  dwThreadID[MAX_THREADS];		// IDs der Threads

	int ThreadPara = 2;

	int a = 1;
	int *p = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p, 0, &amp;dwThreadID[i]);

	cout &lt;&lt; &quot;Threads gestartet...&quot; &lt;&lt; endl;

	while(true)
	{
		*p != 0 ? *p = 0 : *p = 1;
		Sleep(200);
	}

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	int *p = (int*) data;

	while(1)
	{		

		if(*p != 0)
		{	
			EnterSection();

			cout &lt;&lt; &quot;ich bin 1&quot; &lt;&lt; endl;
			Sleep(100);

			LeaveSection();
		}

		else
		{
			EnterSection();	

			cout &lt;&lt; &quot;ich bin 0&quot; &lt;&lt; endl;
			Sleep(100);

			LeaveSection();
		}

	}

	return ((DWORD) data);
}

void EnterSection(void)
{
	while(1)
	{
		if(!Mutex)
		{
			Mutex = true;
			break;
		}

		Sleep(10);
	}
}

void LeaveSection(void)
{
	Mutex = false;
}
</code></pre>
<p>ausgabe: es wird im abstand von 200 milisekunden immer &quot;ich bin 1&quot; oder &quot;ich bin<br />
0&quot; ausgegeben. ich würde nur gerne wissen welcher thread gerade schreibt. ich hab die vermutung das nicht alle threads die erlaubnis bekommen zu schreiben.<br />
gruß xerxes</p>
<p>edit: hier ein screenshot zur programmlaufzeit <a href="http://matthias.sybcom.de/images/console.bmp" rel="nofollow">screenshot</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/532893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/532893</guid><dc:creator><![CDATA[xerxes]]></dc:creator><pubDate>Fri, 04 Jun 2004 08:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Fri, 04 Jun 2004 08:31:20 GMT]]></title><description><![CDATA[<blockquote>
<p>nach dem ausführen wird nur &quot;Threads gestartet...&quot; ausgeben und dann erscheint nichts mehr. hab ich den kritischen abschnitt richtig angewandt?</p>
<p>gruß xerxes</p>
</blockquote>
<p>Nein hast Du nicht (hast die CriticalSection nicht initialisiert, außerdem sollte sie global sein damit alle Threads drauf zugreifen können...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;winbase.h&gt;

//#pragma comment(lib, &quot;coremain.lib&quot;)

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

CRITICAL_SECTION csMyCriticalSection;

int main()
{	
	HANDLE hThread[MAX_THREADS];			// Handles auf die Threads
	DWORD  dwThreadID[MAX_THREADS];		// IDs der Threads

    InitializeCriticalSection(&amp;csMyCriticalSection);

	int ThreadPara = 2;

	int a = 1;
	int *p = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p, 0, &amp;dwThreadID[i]);

	cout &lt;&lt; &quot;Threads gestartet...&quot; &lt;&lt; endl;

	while(true)
	{
		*p != 0 ? *p = 0 : *p = 1;
		Sleep(2000);
	}

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

    DeleteCriticalSection(&amp;csMyCriticalSection);
	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	int *p = (int*) data;

	while(1)
	{
		if(*p != 0)
		{	
			EnterCriticalSection (&amp;csMyCriticalSection);
			cout &lt;&lt; &quot;ich bin 1&quot; &lt;&lt; endl;
			LeaveCriticalSection (&amp;csMyCriticalSection);
			Sleep(1000);
		}

		else
		{
			EnterCriticalSection (&amp;csMyCriticalSection);
			cout &lt;&lt; &quot;ich bin 0&quot; &lt;&lt; endl;
			LeaveCriticalSection (&amp;csMyCriticalSection);
			Sleep(1000);
		}
	}

	DeleteCriticalSection(&amp;csMyCriticalSection);

	return ((DWORD) data);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/532907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/532907</guid><dc:creator><![CDATA[Hepi]]></dc:creator><pubDate>Fri, 04 Jun 2004 08:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Fri, 04 Jun 2004 09:08:35 GMT]]></title><description><![CDATA[<p>hi,<br />
nach der initialisierung funktionierts <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="🙂"
    /><br />
hier hab ich noch einen code. was mich beim folgenden code verwirrt, ist, dass stets die reihenfolge der zahlenreiche eingehalten wird.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;winbase.h&gt;

//#pragma comment(lib, &quot;coremain.lib&quot;)

#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

void EnterCoutSection(void);
void LeaveCoutSection(void);

// Thread_Die sagt ob alle Threads sterben sollen odernicht
bool Thread_Die = false;

bool CoutMutex = false;

int main()
{	
	HANDLE hThread[MAX_THREADS];			// Handles auf die Threads
	DWORD  dwThreadID[MAX_THREADS];		// IDs der Threads

	int ThreadPara = 2;

	int a = 1;
	int *p_a = &amp;a;

	for(int i = 0; i &lt; MAX_THREADS; i++)
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p_a, 0, &amp;dwThreadID[i]);

	cout &lt;&lt; &quot;Threads gestartet...&quot; &lt;&lt; endl;

	for(i = 1; i &lt; 201; i++)
	{
		*p_a = i;
		Sleep(100);
	}

	Thread_Die = true;

/*	WaitForMultipleObjects(	MAX_THREADS,	
							hThread,		
							TRUE,			
							INFINITE);	    

	Thread_Die = true;*/

	for (i = 0; i &lt; MAX_THREADS; i++)
		CloseHandle(hThread[i]);

	cout &lt;&lt; endl;
	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
	int *p = (int*) data;

	while(!Thread_Die)
	{
		if(*p != 0)
		{
			EnterCoutSection();

			Sleep(100);
			cout &lt;&lt; *p &lt;&lt; endl;

			LeaveCoutSection();
		}

		else 
			break;

		Sleep(100);
	}

	return ((DWORD) data);
}

void EnterCoutSection(void)
{
	while(true)
	{
		if(!CoutMutex)
		{
			CoutMutex = true;
			break;
		}

		Sleep(100);
	}
}

void LeaveCoutSection(void)
{
	CoutMutex = false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/532937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/532937</guid><dc:creator><![CDATA[xerxes]]></dc:creator><pubDate>Fri, 04 Jun 2004 09:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Fri, 04 Jun 2004 21:11:30 GMT]]></title><description><![CDATA[<p>xerxes schrieb:</p>
<blockquote>
<p>was mich beim folgenden code verwirrt, ist, dass stets die reihenfolge der zahlenreiche eingehalten wird.</p>
</blockquote>
<p>Was wundert dich daran? Es greifen doch alle Threads auf dieselbe Adresse zu <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>
]]></description><link>https://www.c-plusplus.net/forum/post/533234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/533234</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Fri, 04 Jun 2004 21:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Sat, 05 Jun 2004 00:02:45 GMT]]></title><description><![CDATA[<p>hi<br />
ich hier einen source code der manchen der obigen anforderungen des programms entspricht.<br />
nur macht die falsche synchronisation laufzeitfehler.<br />
bzw ips werden doppelt, dreifach oder mehrfach aufgelöst.<br />
ich müsste dieses programm so modifizieren, dass jede ip nur einmal aufgelöst wird und die reihenfolge von 0 - 255 eingehalten wird.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;winbase.h&gt;
#include &lt;sstream&gt;

//#pragma comment(lib, &quot;coremain.lib&quot;)
#pragma comment(lib, &quot;ws2_32.lib&quot;)
#define MAX_THREADS 10

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID data);

void EnterCoutSection(void);
void LeaveCoutSection(void);

string convert_int(int convert);

// Thread_Die sagt ob alle Threads sterben sollen odernicht
bool Thread_Die = false;

bool CoutMutex = false;

int main()
{   
   HANDLE hThread[MAX_THREADS];         // Handles auf die Threads
   DWORD  dwThreadID[MAX_THREADS];      // IDs der Threads

   int ThreadPara = 2;

   string ip;   
   string *p_ip = &amp;ip;

   WORD wVersionRequested;
   WSADATA wsaData;
   wVersionRequested = MAKEWORD( 2, 2);

   WSAStartup( wVersionRequested, &amp;wsaData );

   for(int i = 0; i &lt; MAX_THREADS; i++)
      hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)p_ip, 0, &amp;dwThreadID[i]);

   cout &lt;&lt; &quot;Threads gestartet...&quot; &lt;&lt; endl;

   for(i = 0; i &lt; 256; i++)
   {
      string temp;
      temp = convert_int(i);

      *p_ip = &quot;213.147.0.&quot; + temp;   
      Sleep(100);
   }

   Thread_Die = true;

/*   WaitForMultipleObjects(   MAX_THREADS,   
                     hThread,      
                     TRUE,         
                     INFINITE);      

   Thread_Die = true;*/

   for (i = 0; i &lt; MAX_THREADS; i++)
      CloseHandle(hThread[i]);

   cout &lt;&lt; endl;
   return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
   string *p = (string*) data;

   HOSTENT *host;
   in_addr inet;

   while(!Thread_Die)
   {
      inet.S_un.S_addr = inet_addr(p-&gt;c_str());

      host = gethostbyaddr((const char*) &amp;inet, 4, AF_INET);

      EnterCoutSection();

      cout &lt;&lt; *p &lt;&lt; &quot; = &quot; &lt;&lt; host-&gt;h_name &lt;&lt; endl;

      LeaveCoutSection();   

      Sleep(10);
   }

   return ((DWORD) data);
}

void EnterCoutSection(void)
{
   while(true)
   {
      if(!CoutMutex)
      {
         CoutMutex = true;
         break;
      }

      Sleep(5);
   }
}

void LeaveCoutSection(void)
{
   CoutMutex = false;
}

string convert_int(int convert_int)
{
   stringstream str;
   string foo;

   str &lt;&lt; convert_int;
   str &gt;&gt; foo;

   return foo;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/533318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/533318</guid><dc:creator><![CDATA[_xerxes]]></dc:creator><pubDate>Sat, 05 Jun 2004 00:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Sat, 05 Jun 2004 08:42:31 GMT]]></title><description><![CDATA[<p>Dann müsstest du in den Threads (nicht im Haupt-Thread) die IP hochzählen, nachdem du sie aufgelöst hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Du solltest dann aber wenn mehrere Threads aber das ändern der IP und das rauskopieren noch in die CriticalSection packen <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/533385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/533385</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Sat, 05 Jun 2004 08:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Synchronisation on Sat, 05 Jun 2004 12:33:34 GMT]]></title><description><![CDATA[<p>_xerxes schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void EnterCoutSection(void)
{
   while(true)
   {
      if(!CoutMutex)
      {
         CoutMutex = true;
         break;
      }
      
      Sleep(5);
   }
}

void LeaveCoutSection(void)
{
   CoutMutex = false;
}
</code></pre>
</blockquote>
<p>Lass dir sowas bloß nicht aufschwätzen! Wenn dein Thread genau zwischen if(!CoutMutex) und CoutMutex=true unterbrochen wird, und zufällig gerade ein anderer Thread ebenfalls CoutMutex sperren will, dann hast du zwei Threads gleichzeitig in dem geschützten Bereich herumschreiben. Wenn du unbedingt etwas Hausgemachtes willst, also keine CRITICAL_SECTION verwenden willst, dann bitte etwas in dieser Art:</p>
<pre><code class="language-cpp">LONG CritSect = FALSE;

void EnterCoutSection()
{
   while(InterlockedExchange(&amp;CritSect, TRUE) != FALSE)
      Sleep(0);
}

void LeaveCoutSection()
{
   InterlockedExchange(&amp;CritSect, FALSE);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/533541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/533541</guid><dc:creator><![CDATA[tag]]></dc:creator><pubDate>Sat, 05 Jun 2004 12:33:34 GMT</pubDate></item></channel></rss>