<?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[Critical Sections bei Zugriff auf CMapWordToOb nötig?]]></title><description><![CDATA[<p>Es gab zwar schon so einen ähnlichen Beitrag heute (Multithreading bei Arrays), aber ich mach trotzdem mal ein eigenes Thema auf. <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="😉"
    /></p>
<p>Zuerst mal ein Stück Code:</p>
<pre><code class="language-cpp">bool CMyClass::SaveData(long id, void* myStruct, int sizeMyStruct)
{	
    CSingleLock lock(&amp;m_Section, false);
    CByteArray *pArchive; // CBA-Pointer für Speicherzugriff auf Element in Map

    ...

    lock.Lock();
    m_Map.SetAt(id, new CByteArray); // neues CBA in Map anlegen
    m_Map.Lookup(id, pArchive);      // neues CBA dem Pointer zuweisen
    pArchive-&gt;SetSize(sizeMyStruct); // Größe für neues CBA setzen
    if(!memcpy(pArchive-&gt;GetData(),myStruct,sizeMyStruct)) // Inhalt aus Struktur ins CBA kopieren
        return false; // falls etwas schief läuft 
    lock.Unlock();

    ...

    return true;
}
</code></pre>
<p>Macht es nun Sinn, Zeilen 11+12 aus Performancegründen vom Locking auszunehmen und die Map wieder freizugeben? Oder wär das keine gute Idee?</p>
<p>Hinweis: Es kann nicht passieren, dass genau dieser Eintrag überschrieben wird, denn jedes Objekt, das in die Map in MyClass (= Singleton) schreiben will, hat seinen eigenen Key für die Map, allerdings könnten andere Objekte zu dem Zeitpunkt an andere Stellen der Map schreiben.</p>
<p>Und inwiefern arbeitet die Map? Ich weiß ja nicht, ob dann vielleicht gerade durch neue Einträge möglicherweise intern gerade die Pointer und Speicherbereiche vom BS umgeschaufelt werden. Oder kann sowas nicht passieren? In der MSDN steht zumindest, dass CMap nicht threadsicher ist, daher würde ich wohl fürs Einschließen von Zeilen 11+12 ins Locking plädieren.</p>
<p>Wie seht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175939/critical-sections-bei-zugriff-auf-cmapwordtoob-nötig</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:54:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175939.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Mar 2007 15:58:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Thu, 15 Mar 2007 15:58:38 GMT]]></title><description><![CDATA[<p>Es gab zwar schon so einen ähnlichen Beitrag heute (Multithreading bei Arrays), aber ich mach trotzdem mal ein eigenes Thema auf. <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="😉"
    /></p>
<p>Zuerst mal ein Stück Code:</p>
<pre><code class="language-cpp">bool CMyClass::SaveData(long id, void* myStruct, int sizeMyStruct)
{	
    CSingleLock lock(&amp;m_Section, false);
    CByteArray *pArchive; // CBA-Pointer für Speicherzugriff auf Element in Map

    ...

    lock.Lock();
    m_Map.SetAt(id, new CByteArray); // neues CBA in Map anlegen
    m_Map.Lookup(id, pArchive);      // neues CBA dem Pointer zuweisen
    pArchive-&gt;SetSize(sizeMyStruct); // Größe für neues CBA setzen
    if(!memcpy(pArchive-&gt;GetData(),myStruct,sizeMyStruct)) // Inhalt aus Struktur ins CBA kopieren
        return false; // falls etwas schief läuft 
    lock.Unlock();

    ...

    return true;
}
</code></pre>
<p>Macht es nun Sinn, Zeilen 11+12 aus Performancegründen vom Locking auszunehmen und die Map wieder freizugeben? Oder wär das keine gute Idee?</p>
<p>Hinweis: Es kann nicht passieren, dass genau dieser Eintrag überschrieben wird, denn jedes Objekt, das in die Map in MyClass (= Singleton) schreiben will, hat seinen eigenen Key für die Map, allerdings könnten andere Objekte zu dem Zeitpunkt an andere Stellen der Map schreiben.</p>
<p>Und inwiefern arbeitet die Map? Ich weiß ja nicht, ob dann vielleicht gerade durch neue Einträge möglicherweise intern gerade die Pointer und Speicherbereiche vom BS umgeschaufelt werden. Oder kann sowas nicht passieren? In der MSDN steht zumindest, dass CMap nicht threadsicher ist, daher würde ich wohl fürs Einschließen von Zeilen 11+12 ins Locking plädieren.</p>
<p>Wie seht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246173</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Thu, 15 Mar 2007 15:58:38 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Fri, 16 Mar 2007 07:10:22 GMT]]></title><description><![CDATA[<p>Hat hier keiner eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246437</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 16 Mar 2007 07:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Fri, 16 Mar 2007 10:13:07 GMT]]></title><description><![CDATA[<p>Auf keinen Fall freigeben. Du darfst nicht lesen während ein anderer Thread schreiben könnte, und du darfst nicht schreiben während ein anderer Thread lesen oder schreiben könnte. Daher darfst du die CS nicht aufmachen.</p>
<p>Davon abgesehen macht man das normal eher so:</p>
<pre><code class="language-cpp">bool CMyClass::SaveData(long id, void* myStruct, int sizeMyStruct)
{    
    std::auto_ptr&lt;CByteArray&gt; pArchive(new CByteArray);

    ...

    pArchive-&gt;SetSize(sizeMyStruct);
    memcpy(pArchive-&gt;GetData(),myStruct,sizeMyStruct);

    {
       CSingleLock lock(&amp;m_Section, true);
       m_Map.SetAt(id, pArchive.release());
    }

    ...

    return true;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1246529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246529</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Mar 2007 10:13:07 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Fri, 16 Mar 2007 15:09:27 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis. Mit der Reihenfolge vom Setzen, Kopieren und dann einfügen hast du natürlich völlig recht. Ist viel sinnvoller. So konnte ich noch einigen Code aus den CS rausnehmen. Weiß gar nicht, wie ich auf diese Methode gekommen bin, <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> die muss ich wohl aus irgendeinem Tutorial oder so haben... <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="😉"
    /></p>
<p>Der auto_ptr geht aber komischerweise nicht (der erzählt mir, auto_ptr wäre kein Member vom std, kann aber eigentlich nicht sein *schulterzuck*). Aber den brauch ich doch auch nicht wirklich oder? Weil erstens brauch ich mein pArchive noch mehrmals in meiner Funktion und zweitens wird der eh zum Ende der Methode wieder gelöscht oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246777</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 16 Mar 2007 15:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Fri, 16 Mar 2007 15:53:42 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Der auto_ptr geht aber komischerweise nicht (der erzählt mir, auto_ptr wäre kein Member vom std, kann aber eigentlich nicht sein *schulterzuck*).</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;memory&gt;
</code></pre>
<blockquote>
<p>Aber den brauch ich doch auch nicht wirklich oder?</p>
</blockquote>
<p>Doch, denn auto_ptr wäre Exception-Save, dein manuelles delete nicht.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246801</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 16 Mar 2007 15:53:42 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Fri, 16 Mar 2007 19:38:06 GMT]]></title><description><![CDATA[<p>Jo, in m_Map.SetAt() kann es nötig sein Speicher anzufordern, und das kann daneben gehen. Und dann fliegt ein bad_alloc. Und dann würde pArchive nichtmehr freigegeben. Du kannst es aber so schreiben:</p>
<pre><code class="language-cpp">bool CMyClass::SaveData(long id, void* myStruct, int sizeMyStruct)
{    
    std::auto_ptr&lt;CByteArray&gt; archiveGuard(new CByteArray);
    CByteArray* pArchive(archiveGuard.get());

    ...

    pArchive-&gt;SetSize(sizeMyStruct);
    memcpy(pArchive-&gt;GetData(),myStruct,sizeMyStruct);

    {
       CSingleLock lock(&amp;m_Section, true);
       m_Map.SetAt(id, pArchive);
       archiveGuard.release(); // ownership wurde an m_Map übertragen
    }

    ...
    pArchive-&gt;... // geht hier dann auch noch

    return true;
}
</code></pre>
<p>Genauer genommen war die erste Variante sogar falsch -- wenn aus SetAt eine Exception fliegt wäre pArchive auch nichtmehr freigegeben worden, und wäre auch nicht in m_Map drinnen -&gt; Leak <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Sorry, mein Fehler!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246932</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Mar 2007 19:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Mon, 19 Mar 2007 15:43:18 GMT]]></title><description><![CDATA[<p>Jo da hab ich mich auch ein wenig gewundert, ob das da nicht schon einen Tick zu zeitig wäre, den Pointer schon beim SetAt freizugeben... naja aber ein Kollege hat spaßeshalber mal am Wochenende die MFC-Map mit der der STL verglichen und bei seinem Test rausgefunden, dass die STL wohl etwa 4x schneller war. Da werd ich wohl eh nochmal einiges umbauen... <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="😉"
    /></p>
<p>Baust du auf, reißt du nieder, hast du Arbeit immer wieder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Aber das wird wahrscheinlich nix am Problem ändern, werd mich dann auch mal um den auto_ptr kümmern <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/1248510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248510</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Mon, 19 Mar 2007 15:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections bei Zugriff auf CMapWordToOb nötig? on Tue, 20 Mar 2007 01:51:44 GMT]]></title><description><![CDATA[<p>Du kannst dir auch boost::shared_ptr (kann &amp; darf man in Container stecken) bzw. die Boost pointer-container angucken.<br />
Die erleichtern die ganze Ownership Sache doch erheblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248852</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 20 Mar 2007 01:51:44 GMT</pubDate></item></channel></rss>