<?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 &#x2F; Multithreading]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Datenbank, auf die mehrere Threads gleichzeitig zugreifen. Es ist eine SQLite Datenbank, die aber keine gleichzeitigen Zugriffe erlaubt.<br />
Ich wollte mir deshalb mit Critical Sections Abhilfe verschaffen.<br />
Die Datenbank-Schnittstelle ist in einer Klasse drin, alle Threads verwenden dieselbe Instanz der Klasse. Ich habe nun ein privates CRITICAL_SECTION-Objekt in der Klasse und ich habe alle public Funktionen (also die, die von den Threads aufgerufen werden können) so aufgebaut:</p>
<pre><code class="language-cpp">int klasse::beispielfunktion()
{
 EnterCriticalSection(&amp;m_cs);
 int iReturn;
 // tue etwas..., lese oder schreibe aus/in DB
 LeaveCriticalSection(&amp;m_cs);
 return iReturn;
}
</code></pre>
<p>Den Teil zwischen Enter und Leave müsste jetzt nur von _einem_ Thread gleichzeitig durchlaufbar sein, oder? Und das bei allen Funktionen, die mit demselben Objekt (m_cs) arbeiten?!<br />
Wäre es hier nicht theoretisch möglich, dass nach Leave der nächste Thread bei derselben Funktion zum Zug kommt, iReturn mit etwas anderem füllt, dann wieder der erste Thread drankommt und iReturn zurückgibt, was allerdings vom nächsten Thread überschrieben wurde? Oder wird diese Variable hier dann im Speicher 2x angelegt?<br />
Weil irgendwie stürzt mein Programm bei vielen gleichzeitigen Zugriffen der Threads ab, ich weiß aber nicht warum <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>Danke im Voraus!</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191926/critical-sections-multithreading</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 04:33:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191926.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Sep 2007 12:14:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Critical Sections &#x2F; Multithreading on Sat, 08 Sep 2007 12:15:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Datenbank, auf die mehrere Threads gleichzeitig zugreifen. Es ist eine SQLite Datenbank, die aber keine gleichzeitigen Zugriffe erlaubt.<br />
Ich wollte mir deshalb mit Critical Sections Abhilfe verschaffen.<br />
Die Datenbank-Schnittstelle ist in einer Klasse drin, alle Threads verwenden dieselbe Instanz der Klasse. Ich habe nun ein privates CRITICAL_SECTION-Objekt in der Klasse und ich habe alle public Funktionen (also die, die von den Threads aufgerufen werden können) so aufgebaut:</p>
<pre><code class="language-cpp">int klasse::beispielfunktion()
{
 EnterCriticalSection(&amp;m_cs);
 int iReturn;
 // tue etwas..., lese oder schreibe aus/in DB
 LeaveCriticalSection(&amp;m_cs);
 return iReturn;
}
</code></pre>
<p>Den Teil zwischen Enter und Leave müsste jetzt nur von _einem_ Thread gleichzeitig durchlaufbar sein, oder? Und das bei allen Funktionen, die mit demselben Objekt (m_cs) arbeiten?!<br />
Wäre es hier nicht theoretisch möglich, dass nach Leave der nächste Thread bei derselben Funktion zum Zug kommt, iReturn mit etwas anderem füllt, dann wieder der erste Thread drankommt und iReturn zurückgibt, was allerdings vom nächsten Thread überschrieben wurde? Oder wird diese Variable hier dann im Speicher 2x angelegt?<br />
Weil irgendwie stürzt mein Programm bei vielen gleichzeitigen Zugriffen der Threads ab, ich weiß aber nicht warum <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>Danke im Voraus!</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1361236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361236</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Sat, 08 Sep 2007 12:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections &#x2F; Multithreading on Sat, 08 Sep 2007 12:48:28 GMT]]></title><description><![CDATA[<p>Ne, jeder Thread hat seinen eigenen Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1361252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361252</guid><dc:creator><![CDATA[tenchou]]></dc:creator><pubDate>Sat, 08 Sep 2007 12:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections &#x2F; Multithreading on Sat, 08 Sep 2007 20:37:16 GMT]]></title><description><![CDATA[<p>Thread-Synchronisation innerhalb der Klasse würde ich glaube ich hier auch nicht machen. Das ist zwar einfacher zu handhaben (so nach dem Motto: die Synch. wird intern geregelt) aber das kann auch mal zu Fehlern führen (wie man sieht <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="🤡"
    /> ). Sowas ist dann schlecht nachvollziehbar.</p>
<p>Hm, ich kann zu Deinem Fehler so natürlich nicht viel sagen, aber probiers doch (wenigstens testweise) mal nach diesem Schema:</p>
<pre><code>EnterCriticalSection(&amp;lock);
obj.MethodCall(blupp);
LeaveCriticalSection(&amp;lock);
</code></pre>
<p>PS: Jeder Thread hat zwar sein eigenes Stack, aber nicht sein eigenes Heap (-&gt; new/delete!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1361581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361581</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Sat, 08 Sep 2007 20:37:16 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections &#x2F; Multithreading on Sun, 09 Sep 2007 12:47:12 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Danke für die Antworten :).<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12048">@CodeFinder</a>: würde sich mir denn eine Alternative anbieten? Also die SQLite datenbank erlaubt halt nur einen Zugriff gleichzeitig ^^. Eine Möglichkeit wäre hier wohl eine job-Queue, die ein weiterer Thread nacheinander abarbeitet, oder?<br />
Ja, um sicher zu gehen habe ich das auch so ähnlich gemacht (damit ich nicht irgendwo was vergesse), für jede public-Funktion:</p>
<pre><code class="language-cpp">class db
{
public:
 bool machedies(int x)
 { EnterCriticalSection(&amp;m_cs); bool bRet = machedies_intern(x); Leave...(); return bRet; }
 bool machedas(int x)
 { EnterCriticalSection(&amp;m_cs); bool bRet = machedas_intern(x); Leave...(); return bRet; }

private:
 bool machedies_intern(int x);
 bool machedas_intern(int x);
};
</code></pre>
<p>Inwiefern ist das fehleranfällig?</p>
<p>[edit]<br />
oder meintest du dass das Enter/Leave komplett außerhalb der Klasse stattfinden soll? Würde das hier irgendwo einen Utnerschied machen?<br />
Ich glaube ich entscheide mich doch für die Job-Queue. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1361865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361865</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Sun, 09 Sep 2007 12:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to Critical Sections &#x2F; Multithreading on Mon, 10 Sep 2007 12:38:53 GMT]]></title><description><![CDATA[<p>Es macht keinen Unterschied ob du &quot;innen&quot; oder &quot;aussen&quot; synchronisierst, ist beides OK.<br />
Und das mit der lokalen Variable ist definitiv KEIN Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1362543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1362543</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 10 Sep 2007 12:38:53 GMT</pubDate></item></channel></rss>