<?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[[sync] eine weitere threrad synchronisierungsfrage]]></title><description><![CDATA[<p>Hallo<br />
Annahme: ich muss zum Zeitpunkt <strong>t</strong> genau <strong>x</strong> Prozesse synchronisieren. Um das Problem zu beschreiben liefert die Methode einen dummy Wert.</p>
<p>Bisherige Lösung (stark abstahiert):</p>
<pre><code class="language-cpp">...
Manager::Manager() : syncCounter(0) {}
...
int Manager::sync()
{
   boost::mutex::scoped_lock lock(syncMutex);
   syncCounter++;
   if( syncCounter&lt; nofCalcClients )  
   {
      syncOnlyWaitCond.wait(lock);
   }
   else //syncCounter==nofCalcClients
   {
      syncCounter = 0;
      syncWaitCond.notify_all();
   }

   return syncCounter;
}
///////////////////////////
int main()
{
   ...
   for(int t=0; t&lt;1000; t++)
   {
      ...
      manager.sync()
   }
   return 0;
}
</code></pre>
<p>das klappt soweit auch. aber ich habe dennoch bedenken:<br />
Annahme:<br />
50 clients syncen<br />
-&gt; 50 haben sync aufgerufen<br />
-&gt; der 50. ruft notify_all() auf<br />
-&gt; 47 clients kehren aus sync zurück<br />
-&gt; bevor nr 48 sync verläßt ist bereits wieder einer der clients, die bereits zurückgekehrt sind erneut in sync (also quasi einer oder mehrere der 47)<br />
-&gt; der rückgabewert von 48 ist u.U. nicht &quot;0&quot;, weil der klassenmemberzähler bereits verändert wurde (z.B. 1)</p>
<p>kann das passieren?<br />
wie vermeide ich das am geschicktesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177083/sync-eine-weitere-threrad-synchronisierungsfrage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 21:11:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177083.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Mar 2007 07:28:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [sync] eine weitere threrad synchronisierungsfrage on Wed, 28 Mar 2007 07:28:58 GMT]]></title><description><![CDATA[<p>Hallo<br />
Annahme: ich muss zum Zeitpunkt <strong>t</strong> genau <strong>x</strong> Prozesse synchronisieren. Um das Problem zu beschreiben liefert die Methode einen dummy Wert.</p>
<p>Bisherige Lösung (stark abstahiert):</p>
<pre><code class="language-cpp">...
Manager::Manager() : syncCounter(0) {}
...
int Manager::sync()
{
   boost::mutex::scoped_lock lock(syncMutex);
   syncCounter++;
   if( syncCounter&lt; nofCalcClients )  
   {
      syncOnlyWaitCond.wait(lock);
   }
   else //syncCounter==nofCalcClients
   {
      syncCounter = 0;
      syncWaitCond.notify_all();
   }

   return syncCounter;
}
///////////////////////////
int main()
{
   ...
   for(int t=0; t&lt;1000; t++)
   {
      ...
      manager.sync()
   }
   return 0;
}
</code></pre>
<p>das klappt soweit auch. aber ich habe dennoch bedenken:<br />
Annahme:<br />
50 clients syncen<br />
-&gt; 50 haben sync aufgerufen<br />
-&gt; der 50. ruft notify_all() auf<br />
-&gt; 47 clients kehren aus sync zurück<br />
-&gt; bevor nr 48 sync verläßt ist bereits wieder einer der clients, die bereits zurückgekehrt sind erneut in sync (also quasi einer oder mehrere der 47)<br />
-&gt; der rückgabewert von 48 ist u.U. nicht &quot;0&quot;, weil der klassenmemberzähler bereits verändert wurde (z.B. 1)</p>
<p>kann das passieren?<br />
wie vermeide ich das am geschicktesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254309</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 28 Mar 2007 07:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to [sync] eine weitere threrad synchronisierungsfrage on Wed, 28 Mar 2007 10:43:34 GMT]]></title><description><![CDATA[<p>Ich glaube auch, dass das von Dir beschriebene Problem auftreten kann. Aus dem Code und der Beschreibung Deiner Anforderung würde ich vermuten, dass das Konstrukt <a href="http://www.boost.org/doc/html/barrier.html" rel="nofollow">boost::barrier</a> besser für diese Aufgabe geeignet ist. Nach der Beschreibung tut boost::barrier exakt das, was Du hier mit der condition und dem syncCounter versuchst.</p>
<p>Ich habe schon einiges mit Multithreading und boost::thread gemacht, aber keine Erfahrung mit barrier. Für welche Anwendungen benötigt man so etwas eigentlich?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1254465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1254465</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Mar 2007 10:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to [sync] eine weitere threrad synchronisierungsfrage on Thu, 29 Mar 2007 07:17:58 GMT]]></title><description><![CDATA[<p>naja, barriers kenne ich von MPI. und da heißt es schon: wenn man barriers im code benutzt, dann stimmt was mit dem design nicht (was daran, liegt, dass es hier ja nur um reinen daten austausch geht und man eben mit hilfe der blockenden send/receive-methoden das syncen bewerkstelligen sollte).</p>
<p>jedenfalls war das wie gesagt ein simple doof beispiel. natürlich mache ich etwas beim syncen und sobald der erste client die methode betritt kann er schon loslegen (wenn er warten würde bis alle in der methode sind, dann kostet das performance und zudem muss man dann dennoch den folgenden bereich schützen, da mit klassenatrributen hantiert wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255096</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 29 Mar 2007 07:17:58 GMT</pubDate></item></channel></rss>