<?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 Syncronisierung von Thread?]]></title><description><![CDATA[<p>Ich realisiere die Syncronisation so. Dast ThreadData objekt wird innerhalb zweier threads verwendet bzw. übergeben. Es Funktioniert auch wunderbar, nun frage ich mich ob dies auch so der richtge ansatz ist?</p>
<pre><code class="language-cpp">struct ThreadData{

 Mutex myMutex&amp;

 int a,b;

 ThreadData(Mutex &amp;m) : myMutex(m){}

 int GetA(){
   myMutex.lock();
   int tmp= a;
   myMutex.unlock();
   return tmp;
 }
int GetB(){
   myMutex.lock();
   int tmp= b;
   myMutex.unlock();
   return tmp;
 }

void SetA(int tmp){
 myMutex.lock();
 a=tmp;
 myMutex.unlock();
}
void SetB(int tmp){
 myMutex.lock();
 b=tmp;
 myMutex.unlock();
}

};
</code></pre>
<p>Oder so ich innerhalb der Threadfunktionen<br />
den <strong>gesamten</strong> Struct locken, verwenden und wieder unlocken?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194388/frage-syncronisierung-von-thread</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 15:56:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194388.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Oct 2007 08:32:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 08:32:06 GMT]]></title><description><![CDATA[<p>Ich realisiere die Syncronisation so. Dast ThreadData objekt wird innerhalb zweier threads verwendet bzw. übergeben. Es Funktioniert auch wunderbar, nun frage ich mich ob dies auch so der richtge ansatz ist?</p>
<pre><code class="language-cpp">struct ThreadData{

 Mutex myMutex&amp;

 int a,b;

 ThreadData(Mutex &amp;m) : myMutex(m){}

 int GetA(){
   myMutex.lock();
   int tmp= a;
   myMutex.unlock();
   return tmp;
 }
int GetB(){
   myMutex.lock();
   int tmp= b;
   myMutex.unlock();
   return tmp;
 }

void SetA(int tmp){
 myMutex.lock();
 a=tmp;
 myMutex.unlock();
}
void SetB(int tmp){
 myMutex.lock();
 b=tmp;
 myMutex.unlock();
}

};
</code></pre>
<p>Oder so ich innerhalb der Threadfunktionen<br />
den <strong>gesamten</strong> Struct locken, verwenden und wieder unlocken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378994</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sat, 06 Oct 2007 08:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 08:46:56 GMT]]></title><description><![CDATA[<p>das ist gut so. kurze locks, die schnell wieder vorbei sind, sind besser als lang andauernde locks.<br />
<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/1379002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379002</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sat, 06 Oct 2007 08:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 08:51:39 GMT]]></title><description><![CDATA[<p>ahh genau, das wollte ich wissen... dacht evtl. das ofte lockereich auf die performce geht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379004</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sat, 06 Oct 2007 08:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 08:56:31 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>ahh genau, das wollte ich wissen... dacht evtl. das ofte lockereich auf die performce geht</p>
</blockquote>
<p>das kann auch passieren, wenn sich hinter den locks/unlocks funktionen verbergen, deren laufzeit man nicht vernachlässigen darf. musste eben messen, was besser ist in deinem fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379007</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sat, 06 Oct 2007 08:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 09:06:07 GMT]]></title><description><![CDATA[<p>hmm ok.. wie siehts bei std::list&lt;&gt; aus? Wenn ein thread bsp. das vordeste element löscht, und ein andere mitten in der liste am iterieren ist? Bei nem std::vector wird problematischer sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379013</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sat, 06 Oct 2007 09:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 12:41:33 GMT]]></title><description><![CDATA[<p>Apeman schrieb:</p>
<blockquote>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>ahh genau, das wollte ich wissen... dacht evtl. das ofte lockereich auf die performce geht</p>
</blockquote>
<p>das kann auch passieren, wenn sich hinter den locks/unlocks funktionen verbergen, deren laufzeit man nicht vernachlässigen darf. musste eben messen, was besser ist in deinem fall.</p>
</blockquote>
<p>lol<br />
WENN sich hinter lock/unlock Funktionen verbergen deren Laufzeit man nicht vernachlässigen darf. Muahaha. WANN ist das denn nicht so bitte?<br />
Locks sind *immer* langsam.<br />
Die Bandbreite erstreckt sich dabei bloss von &quot;langsam&quot; bis &quot;ganz furchtbar schweine-langsam&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379115</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 06 Oct 2007 12:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 13:29:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Locks sind *immer* langsam.</p>
</blockquote>
<p>wieso? bist du winapi-coder?</p>
<pre><code>#define LOCK() scheduler_ticks &amp;= ~ON; while(pending_tasks);
#define UNLOCK() scheduler_ticks |= ON;
</code></pre>
<p><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 />
ausserdem kommt's ja noch auf die aufruffrequenz der locks und unlocks an.<br />
in der regel ist es in muktitasking-systemen besser, wenn eine resource oder critical section schnell wieder frei wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379151</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sat, 06 Oct 2007 13:29:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 13:36:16 GMT]]></title><description><![CDATA[<p>In der WinAPI gibt's afair auch atomare Int-Operationen. Das heißt, Du kommst ganz ohne Locks und Mutexes aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379155</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 06 Oct 2007 13:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 13:39:46 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>In der WinAPI gibt's afair auch atomare Int-Operationen. Das heißt, Du kommst ganz ohne Locks und Mutexes aus.</p>
</blockquote>
<p>stimmt: <a href="http://msdn2.microsoft.com/en-us/library/ms683590.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms683590.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379158</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sat, 06 Oct 2007 13:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 16:46:28 GMT]]></title><description><![CDATA[<p>naja ich verwende das winapi critical_section gedöns... ist das so langsam? wie gehts schneller in der puren c++ syncronisierung?</p>
<pre><code class="language-cpp">#define LOCK() scheduler_ticks &amp;= ~ON; while(pending_tasks);
#define UNLOCK() scheduler_ticks |= ON;
</code></pre>
<p>scheduler_ticks, pending_tasks und ON ?? was sind das für funktionen, kann mir das mal jemand erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379272</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sat, 06 Oct 2007 16:46:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sat, 06 Oct 2007 20:40:23 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>scheduler_ticks, pending_tasks und ON ?? was sind das für funktionen, kann mir das mal jemand erklären?</p>
</blockquote>
<p>das ist nur pseudocode für sehr primitive 'critical sections'.<br />
1. task switching stoppen.<br />
2. abwarten bis alle tasks auf anderen prozessoren beendet sind.<br />
3. critical section ausführen<br />
4. task switching wieder einschalten.<br />
vorteil: sehr schnell, durch die cs wird mit voller geschwindigkeit durchgerauscht, weil das task switching komplett deaktiviert ist.<br />
nachteil: alle tasks sind gestoppt während die cs ausgeführt wird, auch solche, die damit nichts zu tun haben.<br />
das war nur als beispiel gedacht, wegen hustbärs pauschalisierung, dass locks immer sehr langsam sein *müssen*. genau so hätte ich ein beispiel mit 'nem freescale S12X nennen können, der hardware-semaphoren hat und bei dem synchronisation von tasks praktisch keine CPU-zeit beansprucht, aber das wär' nun zu exotisch gewesen. sorry für die verwirrung, mit deinem problem hat das alles natürlich nichts zu tun.<br />
<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/1379413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379413</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sat, 06 Oct 2007 20:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 03:51:11 GMT]]></title><description><![CDATA[<p>Apeman schrieb:</p>
<blockquote>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>scheduler_ticks, pending_tasks und ON ?? was sind das für funktionen, kann mir das mal jemand erklären?</p>
</blockquote>
<p>das ist nur pseudocode für sehr primitive 'critical sections'.<br />
1. task switching stoppen.<br />
2. abwarten bis alle tasks auf anderen prozessoren beendet sind.</p>
</blockquote>
<p>Was im Schnitt etliche MILLIsekunden braucht.</p>
<blockquote>
<p>3. critical section ausführen<br />
4. task switching wieder einschalten.<br />
vorteil: sehr schnell, durch die cs wird mit voller geschwindigkeit<br />
durchgerauscht, weil das task switching komplett deaktiviert ist.</p>
</blockquote>
<p>Wenn du das schnell nennst... naja. Da haben wir etwas andere Vorstellungen von &quot;schnell&quot;. Schnell wäre für mich &lt; 10nS oder sowas.</p>
<blockquote>
<p>nachteil: alle tasks sind gestoppt während die cs ausgeführt wird, auch solche, die damit nichts zu tun haben.<br />
das war nur als beispiel gedacht, wegen hustbärs pauschalisierung, dass locks immer sehr langsam sein *müssen*. genau so hätte ich ein beispiel mit 'nem freescale S12X nennen können, der hardware-semaphoren hat und bei dem synchronisation von tasks praktisch keine CPU-zeit beansprucht, aber das wär' nun zu exotisch gewesen. sorry für die verwirrung, mit deinem problem hat das alles natürlich nichts zu tun.<br />
<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>Locks müssen nicht immer langsam sein, gibt kein Gesetz welches das vorschreibt. Sie *sind* es bloss immer (zumindest bei &gt; 1 CPU/Core mit shared memory).<br />
Guck dir den Linux Kernel an, dort werden als Locks fast ausschliesslich Spin-Locks verwendet, und das bedeutet min. 1 atomic instruction pro Lock/Unlock Paar, auf vielen Plattformen sogar 2 atomic instructions.<br />
Der Windows-Kernel verwendet genauso Spin-Locks. Und atomic instructions sind üblicherweise sehr sehr teuer, verglichen mit anderen Befehlen.</p>
<p>Ja, das ist eine Pauschalisierung, aber ich sehe nicht wo diese falsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379507</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Oct 2007 03:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 04:01:28 GMT]]></title><description><![CDATA[<p>Apeman schrieb:</p>
<blockquote>
<p>Jester schrieb:</p>
<blockquote>
<p>In der WinAPI gibt's afair auch atomare Int-Operationen. Das heißt, Du kommst ganz ohne Locks und Mutexes aus.</p>
</blockquote>
<p>stimmt: <a href="http://msdn2.microsoft.com/en-us/library/ms683590.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms683590.aspx</a></p>
</blockquote>
<p>Jo, wobei der Grund dass Locks langsam sind ja die Verwendung von atomic instructions ist.<br />
Faustregel für x86/x64 Systeme: wenn man mehr als 2 atomic instructions für irgendwas braucht kann man gleiche ne Spin-Lock nehmen weil's mit der Spin-Lock schneller sein wird als &quot;Lock-Free&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379508</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Oct 2007 04:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 10:06:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Apeman schrieb:</p>
<blockquote>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>scheduler_ticks, pending_tasks und ON ?? was sind das für funktionen, kann mir das mal jemand erklären?</p>
</blockquote>
<p>das ist nur pseudocode für sehr primitive 'critical sections'.<br />
1. task switching stoppen.<br />
2. abwarten bis alle tasks auf anderen prozessoren beendet sind.</p>
</blockquote>
<p>Was im Schnitt etliche MILLIsekunden braucht.</p>
</blockquote>
<p>warum sollte es? das 'warten' heisst ja nicht, dass andere tasks ihre komplette zeitscheibe verbraucht haben müssen, sondern es wird nur gewartet, bis sie angehalten wurden d.h. sie dürfen maximal ihren aktuellen maschinenbefehl ausführen und stoppen dann. ich verstehe nicht, wieso das *milli*sekunden dauern sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379571</guid><dc:creator><![CDATA[Apeman]]></dc:creator><pubDate>Sun, 07 Oct 2007 10:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 12:08:07 GMT]]></title><description><![CDATA[<p>kann mir mal einer erklären, warum man das mit mutexen serialisieren muss?<br />
das hat ja wohl gar keinen sinn.</p>
<p>[quote=&quot;BorisDieKlinge&quot;]</p>
<pre><code class="language-cpp">struct ThreadData{

 Mutex myMutex&amp;

 int a,b;

 ThreadData(Mutex &amp;m) : myMutex(m){}

 int GetA(){
   myMutex.lock();
   int tmp= a;
   myMutex.unlock();
   return tmp;
 }
int GetB(){
   myMutex.lock();
   int tmp= b;
   myMutex.unlock();
   return tmp;
 }

void SetA(int tmp){
 myMutex.lock();
 a=tmp;
 myMutex.unlock();
}
void SetB(int tmp){
 myMutex.lock();
 b=tmp;
 myMutex.unlock();
}

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1379640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379640</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Sun, 07 Oct 2007 12:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 16:14:41 GMT]]></title><description><![CDATA[<p>Apeman schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Apeman schrieb:</p>
<blockquote>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>scheduler_ticks, pending_tasks und ON ?? was sind das für funktionen, kann mir das mal jemand erklären?</p>
</blockquote>
<p>das ist nur pseudocode für sehr primitive 'critical sections'.<br />
1. task switching stoppen.<br />
2. abwarten bis alle tasks auf anderen prozessoren beendet sind.</p>
</blockquote>
<p>Was im Schnitt etliche MILLIsekunden braucht.</p>
</blockquote>
<p>warum sollte es? das 'warten' heisst ja nicht, dass andere tasks ihre komplette zeitscheibe verbraucht haben müssen,</p>
</blockquote>
<p>doch</p>
<blockquote>
<p>sondern es wird nur gewartet, bis sie angehalten wurden</p>
</blockquote>
<p>wer soll sie denn anhalten?</p>
<blockquote>
<p>d.h. sie dürfen maximal ihren aktuellen maschinenbefehl ausführen und stoppen dann.</p>
</blockquote>
<p>falsch - woher sollen sie denn wissen dass sie stoppen sollen?</p>
<blockquote>
<p>ich verstehe nicht, wieso das *milli*sekunden dauern sollte?</p>
</blockquote>
<p>ist halt so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379820</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Oct 2007 16:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 16:16:22 GMT]]></title><description><![CDATA[<p>jenz schrieb:</p>
<blockquote>
<p>kann mir mal einer erklären, warum man das mit mutexen serialisieren muss?<br />
das hat ja wohl gar keinen sinn.</p>
</blockquote>
<p>doch das macht sinn, da du die sichtbarkeit von änderungen garantieren musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379823</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Oct 2007 16:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 16:22:08 GMT]]></title><description><![CDATA[<p>sichtbarkeit von änderungen garantieren?</p>
<p>was meinst du denn damit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379828</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Sun, 07 Oct 2007 16:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 17:20:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9581">@Jenz</a>: Andere frage, wie würdest du es tun? Was macht bei dir Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379884</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sun, 07 Oct 2007 17:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 17:25:38 GMT]]></title><description><![CDATA[<p>es werden nur ints gelesen bzw. geschrieben.</p>
<p>was soll da schief gehen?</p>
<p>da braucht man nichts synchronisieren.</p>
<p>vielleicht auf irgendwelchen exotischen geräten,<br />
aber sonst sollte da doch nicht passieren können, oder liege ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379893</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Sun, 07 Oct 2007 17:25:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Sun, 07 Oct 2007 22:39:15 GMT]]></title><description><![CDATA[<p>jenz schrieb:</p>
<blockquote>
<p>es werden nur ints gelesen bzw. geschrieben.</p>
<p>was soll da schief gehen?</p>
<p>da braucht man nichts synchronisieren.</p>
<p>vielleicht auf irgendwelchen exotischen geräten,<br />
aber sonst sollte da doch nicht passieren können, oder liege ich da falsch?</p>
</blockquote>
<ol>
<li>
<p>Ohne volatile und/oder Mutex ist nichtmal garantiert ob der Compiler für die Zuweisung überhaupt Code generiert.</p>
</li>
<li>
<p>Ja, auf &quot;exotischen&quot; Geräten (z.B. PowerPC, DEC Alpha, ...) kann es passieren dass Änderungen am Speicher (eben &quot;das Schreiben von ints&quot;) die CPU 1 macht von CPU 2 z.B. in der falschen Reihenfolge &quot;gesehen&quot; werden. Was je nachdem um was für Code es sich handelt katastrophale oder garkeine Folgen haben kann.</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1380159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380159</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Oct 2007 22:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Mon, 08 Oct 2007 06:22:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<ol>
<li>Ohne volatile und/oder Mutex ist nichtmal garantiert ob der Compiler für die Zuweisung überhaupt Code generiert.</li>
</ol>
</blockquote>
<p>da hilft der mutex auch nicht. volatile muss sein.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<ol start="2">
<li>Ja, auf &quot;exotischen&quot; Geräten (z.B. PowerPC, DEC Alpha, ...) kann es passieren dass Änderungen am Speicher (eben &quot;das Schreiben von ints&quot;) die CPU 1 macht von CPU 2 z.B. in der falschen Reihenfolge &quot;gesehen&quot; werden. Was je nachdem um was für Code es sich handelt katastrophale oder garkeine Folgen haben kann.</li>
</ol>
</blockquote>
<p>was hilft da der mutex?<br />
da wird doch keine reihenfolge vorgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380202</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Mon, 08 Oct 2007 06:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Mon, 08 Oct 2007 09:41:57 GMT]]></title><description><![CDATA[<p>jenz schrieb:</p>
<blockquote>
<p>da hilft der mutex auch nicht. volatile muss sein.</p>
</blockquote>
<p>nein. Bitte mach dich erst mit den Grundlagen ein wenig vertraut. volatile macht zugriffe auf eine variable beobachtbar. Und auch Aufrufe von I/O-Funktionen (zu denen mutex-locks gehören) sind beobachtbar. Folglich sind beide geeignet, &quot;die Generierung von Code zu erzwingen&quot;. volatile wiederum ist völlig ungeeignet, die notwendige Semantik für geteilten Zugriff in mehreren Threads auszudrücken, da volatile-Zugriffe nur untereinander und innerhalb eines Threads geordnet sind - alles andere ist im Grunde undefiniert.</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<ol start="2">
<li>Ja, auf &quot;exotischen&quot; Geräten (z.B. PowerPC, DEC Alpha, ...) kann es passieren dass Änderungen am Speicher (eben &quot;das Schreiben von ints&quot;) die CPU 1 macht von CPU 2 z.B. in der falschen Reihenfolge &quot;gesehen&quot; werden. Was je nachdem um was für Code es sich handelt katastrophale oder garkeine Folgen haben kann.</li>
</ol>
</blockquote>
<p>was hilft da der mutex?<br />
da wird doch keine reihenfolge vorgegeben.</p>
</blockquote>
<p>Ein mutex - so wie andere Synchronisationsprimitive - etabliert eine zeitliche Ordnung von Zugriffen auf denselben (wie das geschieht, kann uns erst mal egal sein) - &quot;vor, während, nach der anforderung des mutex&quot; ist für eine bestmmmte Operation in allen Threads gleich. Da mutex locks, wie oben gesehen, beobachtbar sind <em>und</em> potentiell den globalen Zustand verändern, sind alle Zugriffe auf globale Zustände relativ zu diesem mutex-aufruf geordnet. Damit folgt, dass Datenzugriffe, die durch eine mutex geschützt werden, in allen Threads zeitlich gleich geordnet sind. Und das ist im Grunde, was Synchronisation bedeutet. volatile ist demgegenüber nahezu nutzlos.</p>
<p>Sichtbarkeit hat mittelbar auch etwas damit zu tun. Hier geht es im Grunde um die Identität von Objekten. Angenommen, wir haben in zwei Therads einen Pointer p auf z.B. ein int und dieser Pointer habe - wie auch immer er erlangt wurde - den gleichen Wert in beiden Threads. Bedeutet das dann, dass *p in beiden Threads auf das gleiche Objekt verweisen?:<br />
Moderne Prozessoren haben alle einen Cache, der eine Kopie von Inhalten des Hauptspeichers enthält. Operation benutzen im Grunde nur diesen Cache und immer wenn sich dessen Inhalt verändert, muss der Prozessor den entsprechenden Hauptspeicherinhalt anpassen - das geschieht automatisch (und dieser Vorgang ist nebenbei in obigem Sinne zwischen verschiedenen Prozessoren durch die Hardware synchronisiert) ist aber nicht mit der Veränderung des Cacheinhalts identisch. Ein zweiter Prozessor (auf einem anderen Sockel und mit völlig getrennten Cache) muss nun dafür sorgen, dass er seinen Cacheinhalt - sofern dieser eine Kopie des gleichen Speicherplatzes enthält - ebenfalls anpasst. Das ist aber zeitlich und logisch völlig getrennt von der Operation, die die Änderung des Speichers verursacht hat. Für diese Anpassung ist ebenfalls die Hardware zuständig, aber sobald es keinen gemeinsamen Speicherbus mehr gibt (Stichwort NUMA) - oder das Busprotokoll das nicht so her gibt, kann der 2. Prozessor dieses Update nicht mehr zeitgleich mit dem 1. Prozessor durchführen. Beides ist in x86-Systemen weitgehend unproblematisch, da diese Architektur traditionell streng geordnet ist. Das muss nicht so bleiben, zumal eine solche Architektur schlecht skaliert. Was wir hier brauchen, ist eine memory barrier - vereinfacht gesagt synchronisiert diese zwischen Kopien des gleichen Objekts, während einen Mutex (zunächst) nur Zugriffe auf einer Kopie synchronisiert. Ein vollständiger Mutex wird in der Realität natürlich immer auch eine mamemory barrier mitbringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380281</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 08 Oct 2007 09:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Mon, 08 Oct 2007 09:22:52 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>jenz schrieb:</p>
<blockquote>
<p>da hilft der mutex auch nicht. volatile muss sein.</p>
</blockquote>
<p>nein. Bitte mach dich erst mit den Grundlagen ein wenig vertraut. volatile macht zugriffe auf eine variable beobachtbar. Und auch Aufrufe von I/O-Funktionen (zu denen mutex-locks gehören) sind beobachtbar. Folglich sind beide geeignet, &quot;die Generierung von Code zu erzwingen&quot;. volatile wiederum ist völlig ungeeignet, die notwendige Semantik für geteilten Zugriff in mehreren Threads auszudrücken, da volatile-Zugriffe nur untereinander und innerhalb eines Threads geordnet sind - alles andere ist im Grunde undefiniert.</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<ol start="2">
<li>Ja, auf &quot;exotischen&quot; Geräten (z.B. PowerPC, DEC Alpha, ...) kann es passieren dass Änderungen am Speicher (eben &quot;das Schreiben von ints&quot;) die CPU 1 macht von CPU 2 z.B. in der falschen Reihenfolge &quot;gesehen&quot; werden. Was je nachdem um was für Code es sich handelt katastrophale oder garkeine Folgen haben kann.</li>
</ol>
</blockquote>
<p>was hilft da der mutex?<br />
da wird doch keine reihenfolge vorgegeben.</p>
</blockquote>
<p>Ein mutex - so wie andere Synchronisationsprimitive - etabliert eine zeitliche Ordnung von Zugriffen auf denselben (wie das geschieht, kann uns erst mal egal sein) - &quot;vor, während, nach der anforderung des mutex&quot; ist für eine bestmmmte Operation in allen Threads gleich. Da mutex locks, wie oben gesehen, beobachtbar sind <em>und</em> potentiell den globalen Zustand verändern, sind alle Zugriffe auf globale Zustände relativ zu diesem mutex-aufruf geordnet. Damit folgt, dass Datenzugriffe, die durch eine mutex geschützt werden, in allen Threads zeitlich gleich geordnet sind. Und das ist im Grunde, was Synchronisation bedeutet. volatile ist demgegenüber nahezu nutzlos.</p>
</blockquote>
<p>hallo hallo, vielleicht liest du einfach noch mal den ganzen thread???</p>
<p>es geht um int variablen, da wird ein mutex überhaupt keine codeerzeugung bewirken...</p>
<p>und die reihenfolge sehe ich immer noch nicht. klar, mit nem mutex können zwei threads/prozesse nicht gleichzeitig auf die variable zugreifen, aber das können sie bei ints sowieso nicht...<br />
(edit)<br />
natürlich prozesse können das, aber es ist völlig egal in dem hier gezeigten beispiel. es gibt keine &quot;reihenfolge&quot;<br />
(/edit)</p>
<p>man muss lesen von a und b einfach nicht mit nem lock umgeben.</p>
<p>wenn ich mehrere schritte nacheinander abarbeiten will, dann muss ich das locken.<br />
zum beispiel tauschen von zwei variablen:</p>
<p>pseudo</p>
<pre><code>lock
int help = a;
a = b;
b = help;
unlock
</code></pre>
<p>aber nur das lesen von dem int???</p>
<p>gebt mir doch bitte mal ein beispiel...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380292</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Mon, 08 Oct 2007 09:22:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Mon, 08 Oct 2007 09:31:30 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9581">@jenz</a>: Das war eine Allgemeine frage, es können auch andere typen sein... Es ging lediglich darum, ob ich jedes mal lock bzw. unlock bei einem zugriff, oder ob ich die ganze struktur mit den daten komplett locke...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380306</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Mon, 08 Oct 2007 09:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage Syncronisierung von Thread? on Mon, 08 Oct 2007 09:51:11 GMT]]></title><description><![CDATA[<p>jenz schrieb:</p>
<blockquote>
<p>hallo hallo, vielleicht liest du einfach noch mal den ganzen thread???</p>
</blockquote>
<p>denkst du nach, bevor du postest?</p>
<blockquote>
<p>man muss lesen von a und b einfach nicht mit nem lock umgeben.<br />
...<br />
wenn ich mehrere schritte nacheinander abarbeiten will, dann muss ich das locken.</p>
</blockquote>
<p>Ohne Begründung ist das nur so dahergesagt. Und nebenbei auch falsch. Selbst wenn der Zugriff als solcher atomar ist, wird das Lesen ohne Synchronisation den Inhalt vor oder nach (bezogen auf die absolute Zeit) der Änderung in einem anderen Thread liefern - das wird selten das sein, was man will.</p>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9581">@jenz</a>: Das war eine Allgemeine frage, es können auch andere typen sein... Es ging lediglich darum, ob ich jedes mal lock bzw. unlock bei einem zugriff, oder ob ich die ganze struktur mit den daten komplett locke...</p>
</blockquote>
<p>Beides ist möglich und die Antwort hängt von der Nutzung ab und davon, welche Invarianten zwischen den Elementen der Struktur gelten sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380320</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 08 Oct 2007 09:51:11 GMT</pubDate></item></channel></rss>