<?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[Boost::SharedMemory ReadModifyWrite]]></title><description><![CDATA[<p>Hi,</p>
<p>wie ist denn das.<br />
Wenn ich in ein boost shared memory schreibe,<br />
sind die Schreib/Lese-zugriffe dann atomar ??</p>
<p>also ein ReadModifyWrite(cmpxchgb) auf einem Shared memory block.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323768/boost-sharedmemory-readmodifywrite</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 18:42:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323768.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Feb 2014 12:18:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost::SharedMemory ReadModifyWrite on Sat, 15 Feb 2014 12:22:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie ist denn das.<br />
Wenn ich in ein boost shared memory schreibe,<br />
sind die Schreib/Lese-zugriffe dann atomar ??</p>
<p>also ein ReadModifyWrite(cmpxchgb) auf einem Shared memory block.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383306</guid><dc:creator><![CDATA[NasenBaer_2013]]></dc:creator><pubDate>Sat, 15 Feb 2014 12:22:43 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::SharedMemory ReadModifyWrite on Sat, 15 Feb 2014 15:51:48 GMT]]></title><description><![CDATA[<p>So allgemein gefragt? Nein. Es gibt generell recht wenig, was ein Prozess unter der Kontrolle eines Betriebssystems atomisch machen kann, und noch weniger, was plattformunabhängig umsetzbar ist. Atomisches CAS auf ein Maschinenwort ist so die Größenordnung, mit der man da rechnen darf.</p>
<p>Es gibt aber in Boost.Interprocess eine ganze Reihe von Synchronisationsmechanismen, die man benutzen kann, damit sich zwei Prozesse nicht in die Haare kommen, wenn sie auf dem selben Speicherbereich herumschreiben wollen. Ich lasse man einen <a href="http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/synchronization_mechanisms.html" rel="nofollow">Link</a> da. Das läuft in einfachsten Fall ungefähr so:</p>
<pre><code class="language-cpp">// sei shm der shared memory, dann:

struct shared_data {
  boost::interprocess::interprocess_mutex mutex;

  // Was du sonst so brauchst. Beispiel:
  int x;
  int y;
  int z;
};

...

shared_data *data = new(shm.get_address()) shared_data;

...

{
  using boost::interprocess::scoped_lock;
  using boost::interprocess::interprocess_mutex;

  // Mutex locken; solange das Lock existiert, kann der andere Prozess
  // den Mutex nicht locken und wartet auf seine Freigabe
  scoped_lock&lt;interprocess_mutex&gt; lock(data-&gt;mutex);

  data-&gt;x += 12;
  data-&gt;y *= 13;
  data-&gt;z -= 14;
} // Lock wird hier zerstört, jetzt kann der andere Prozess den Mutex locken, wenn er will.
</code></pre>
<p><strong>Wichtig ist, dass alle Zugriffe auf den geteilten Speicherbereich durch ein Lock auf den Mutex geschützt sind.</strong> Dann greifen die Prozesse nie gleichzeitig darauf zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383334</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 15 Feb 2014 15:51:48 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::SharedMemory ReadModifyWrite on Sun, 16 Feb 2014 16:18:44 GMT]]></title><description><![CDATA[<p>Hi seldon,</p>
<p>danke für die Antwort.</p>
<p>Das mutex konzept ist mir bekannt.<br />
Ich brauche aber kein Mutex.</p>
<p>Mutexe arbeiten auch mit einem readmodifywrite aber<br />
dort gibt es dann die Möglichkeit einer Verschränkung.<br />
Oder das hengen in einer Endlosschleife....</p>
<p>Ich mache einen atomaren Zugriff, und wenn ich ihn nicht bekomme, dann gibt es einen Softwarefehler und das Programm bricht ab.</p>
<p>Also eher ein Check.</p>
<p>Das mutex kozept arbeitet zwar auch mit atomaren zugriffen, aber<br />
das ist eben rein konzeptmäßig anderst. Es wird gewartet, bis auf dem Speicherblock kein prozess mehr arbeitet.<br />
Kosten: Weniger Speicher auf Kosten von Zeit und der möglichkeit<br />
in einer Endlosschleife zu hängen.<br />
Das will ich nicht.</p>
<p>Ich weiß dass mein Befehl atomar ist.<br />
Aber ich weiß nicht, wie boost den Speicherbereich abbildet.<br />
Was genau passiert, wenn ich in boost shared memory schreibe.<br />
Liegen dahinter nochmal OS aufrufe bei dereferenzieren??</p>
<p>Kurz - Mir macht sogen dass ich nicht weiß was hinter boost shared memory steckt.</p>
<p>=&gt; ich vermute stark dass einfach ein paging mechanismus verwendet wird, welcher dann in hardware (deskriptoren) gemacht wird.<br />
Dann ist alles in butter??? - Oder sind zugriffe auf virtuellen speicher nie atomar ???.</p>
<p>Auf der anderen Seite habe ich in linux über die Strukture file_operations<br />
mal für zwei prozesse sowas wie ne pipe gebaut.<br />
Da würde dann bei einem Zugriff ein read()/write() dahinter stecken.<br />
...</p>
<p>Wenn ich das shared memory von boost implementieren sollte, meine ich beide möglichkeiten umsetzen zu können. Und ich finde keine beschreibung, wie es gemacht ist.... Und deswegen bin ich mir unsicher..</p>
<p>Na ja ev. schau ichs mir mal an...<br />
Wenn ich einen Windows service mache, und ihn als Treiber anmelde, habe ich ev. zugriff auf die deskriptoren.... aber das ist wieder elend viel arbeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383478</guid><dc:creator><![CDATA[NasenBaer_2013]]></dc:creator><pubDate>Sun, 16 Feb 2014 16:18:44 GMT</pubDate></item></channel></rss>