<?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[Cross-thread calls]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>folgende Situation: ich habe einen Main-Thread, in dem via non-blocking Sockets Daten ankommen. Ich verarbeite diese nun vorab und bereite diese auf.</p>
<p>Nun soll ein Thread erstellt werden, der die Daten annimmt (diese Daten bestehen aus einer simplen Klasse mit einer std::map&lt;std::string, std::string&gt; und std::vector&lt;char&gt;). Der Thread stellt dann was mit den Daten an und erstellt ein neues Datenpaket daraus. So weit kein Problem.</p>
<p>Das eigentliche Problem ist nun, dass aus dem Thread aus eine Funktion im Haupt-Thread aufgerufen werden muss - also ein cross-thread call (die neuen Daten sollen dabei übergeben werden). Das knifflige: Der Haupt-Thread darf unter keinen umständen pausiert werden. Das wiederrum tolle an der Sache: es muss niemals ein zweiseitiger Zugriff stattfinden (ergo kann ich mir Mutexing meiner Meinung nach sparen). Leider finde ich unter diesem Suchbegriff fast nichts. Woran liegt das? Ist die Methode so unüblich?</p>
<p>Ich kenne diese Vorgehensweise aus C# und dort funktioniert sie ganz wunderbar einfach.</p>
<p>Wonach muss ich suchen?<br />
Oder gibt es bessere Verfahren für mein Problem?<br />
Ich bitte darum, von Lösungen mit boost oder anderen externen Bibliotheken abzusehen. (ja, ich weiß, dass es eine quasi-standard-Bibliothek ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305849/cross-thread-calls</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:07:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305849.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Jul 2012 14:14:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:15:19 GMT]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>folgende Situation: ich habe einen Main-Thread, in dem via non-blocking Sockets Daten ankommen. Ich verarbeite diese nun vorab und bereite diese auf.</p>
<p>Nun soll ein Thread erstellt werden, der die Daten annimmt (diese Daten bestehen aus einer simplen Klasse mit einer std::map&lt;std::string, std::string&gt; und std::vector&lt;char&gt;). Der Thread stellt dann was mit den Daten an und erstellt ein neues Datenpaket daraus. So weit kein Problem.</p>
<p>Das eigentliche Problem ist nun, dass aus dem Thread aus eine Funktion im Haupt-Thread aufgerufen werden muss - also ein cross-thread call (die neuen Daten sollen dabei übergeben werden). Das knifflige: Der Haupt-Thread darf unter keinen umständen pausiert werden. Das wiederrum tolle an der Sache: es muss niemals ein zweiseitiger Zugriff stattfinden (ergo kann ich mir Mutexing meiner Meinung nach sparen). Leider finde ich unter diesem Suchbegriff fast nichts. Woran liegt das? Ist die Methode so unüblich?</p>
<p>Ich kenne diese Vorgehensweise aus C# und dort funktioniert sie ganz wunderbar einfach.</p>
<p>Wonach muss ich suchen?<br />
Oder gibt es bessere Verfahren für mein Problem?<br />
Ich bitte darum, von Lösungen mit boost oder anderen externen Bibliotheken abzusehen. (ja, ich weiß, dass es eine quasi-standard-Bibliothek ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231630</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:19:52 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Das eigentliche Problem ist nun, dass aus dem Thread aus eine Funktion im Haupt-Thread aufgerufen werden muss - also ein cross-thread call (die neuen Daten sollen dabei übergeben werden). Das knifflige: Der Haupt-Thread darf unter keinen umständen pausiert werden.</p>
</blockquote>
<p>Eine Funktion gehört nicht zu irgendeinem Thread. Das einzige Problem bei Einsatz von Threads ist Synchronisation, wenn Du das - wie auch immer - nicht hast, dann hast Du keins.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231631</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:23:26 GMT]]></title><description><![CDATA[<p>Moment... Wenn ich aus dem Worker-Thread heraus eine Funktion aufrufe, befindet sich die aufgerufene Funktion doch nun auch im Kontext des aufrufenden Threads, oder nicht? (Da bin ich mir eigentlich relativ sicher)</p>
<p>Genau das darf aber nicht. Die aufgerufene Funktion muss wieder im Kontext des Haupt-Threads laufen, da es Daten durch das Socket verschicken muss und generell vorher noch einige Operationen laufen lässst.</p>
<p>Demnach gibt es wohl doch Synchronisationsbedarf. Das Problem ist nur, dass bei Synchronisierung immer ein Thread warten muss. Und das darf bei mir eben nicht der Haupt-Thread sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231633</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:31:16 GMT]]></title><description><![CDATA[<p>Cross-thread-calls -&gt; Dispatching, Marshalling</p>
<p>Diese Methode ist nicht unüblich. Einerseits kannst Du das direkt mit (OS) API Funktionen erreichen (unter Windows z.B. PostThreadMessage(..) oder QueueUserAPC(..)) oder z.B. mit boost::asio realisieren (z.B. einen boost::asio::io_service mit nur einem Thread betreiben und dann boost::asio::io_service::post(..) benutzen.). Die Problematik liegt allerdings darin, dass es viele Mechanismen für Event-Loops/Dispatcher gibt () und diese untereinander nicht kompatibel sind.</p>
<p>Z.B. muss für User APC der Thread im alertable Zustand sein, was durch einen Aufruf von z.B. SleepEx(..) erreicht wird. Das heisst, wenn Du einen Windows Message Loop hast, kommst Du mit z.B. boost::asio nicht weit, dafür mit PostThreadMessage(..).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231640</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:32:05 GMT]]></title><description><![CDATA[<p>Also noch mal langsam:<br />
Du hast eine Funktion, die aus mehreren (zwei) Threads aufgerufen werden soll. Das ist kein Problem, solange diese Funktion keine statischen Variablen hat. Jeder Thread hat seinen eigenen Stack und die Funktion kann durchaus zeitgleich von allen Threads aufgerufen und durchlaufen werden.<br />
Ein Problem kann nur dann auftreten, wenn in verschiedenen Threads auf dieselben <strong>Daten</strong> zugegriffen wird (Deshalb ist eine in beiden Threads benutzte Funktion <strong>mit statischen Variablen</strong> auch problematisch). Dabei wiederum ist es aber irrelevant, ob der Zugriff auf die Daten in derselben Funktion oder in unterschiedlichen Funktionen passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231641</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:32:05 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:42:07 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Moment... Wenn ich aus dem Worker-Thread heraus eine Funktion aufrufe, befindet sich die aufgerufene Funktion doch nun auch im Kontext des aufrufenden Threads, oder nicht? (Da bin ich mir eigentlich relativ sicher)</p>
</blockquote>
<p>Selbstverständlich ist das so.<br />
Um eine Funktion an einen anderen Thread weiterzugeben, hinterlegt man diese an einem gemeinsam bekannten Ort von dem der andere Thread sich die abholt und ausführt ( <code>boost::asio::io_service::post()/run()</code> ). In .NET nennt man das <code>Dispatcher</code> .</p>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>Genau das darf aber nicht. Die aufgerufene Funktion muss wieder im Kontext des Haupt-Threads laufen, da es Daten durch das Socket verschicken muss und generell vorher noch einige Operationen laufen lässst.</p>
</blockquote>
<p>Warum verschickt das nicht einfach der Worker oder ein ganz anderer Thread? Was genau ist der Zweck des Haupt-Threads? Was für &quot;Operationen&quot; finden da noch statt?</p>
<p>Du musst konkreter werden. Multi-Threading ist nicht einfach und es gibt keine Patentrezepte.<br />
Am besten lernst du erst einmal selbst wie das mit Threads funktioniert (zum Beispiel mit Boost.Thread). Die Antworten hier dürften hingegen eher für Verwirrung sorgen.</p>
<p>Wenn es keine begründeten Argumente gegen Boost.Asio gibt, nimm besser das für Netzwerk und als Dispatcher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231644</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 14:39:56 GMT]]></title><description><![CDATA[<p>Ich glaube, du hast mich nicht richtig verstanden.<br />
Hier ein kleiner Ablaufplan, ich hoffe, der hilft.<br />
Ausführlich werde ich gleich antworten, ich fahre derweil einkaufen <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>
<pre><code>[Momentan im HauptThread]
                |
		    |
		    |
		    v
Daten kommen via Socket an (recv)
                |
		    |
		    |
		    v
Werden aufbereitet in eine Klasse:

class Data
{
public:
	// Getter &amp; Setter

private:
	std::map&lt;std::string, std::string&gt; _pairs;
	std::vector&lt;unsigned char&gt; _bytes;
};
                |
		    |
		    |
		    v
Daten werden weiterhin im Haupt-Thread verarbeitet
                |
		    |
		    |
		    v
Haupt-Thread ruft neuen Thread (Worker Thread) und übergibt
Daten via Pointer (vllt. geht das auch über RAII?)
                |
		    |
		    |
		    v
Haupt-Thread soll weiterhin ohne geblockt zu werden laufen,
greift nicht auf die Daten zu.
Worker-Thread greift auf Daten zu und verarbeitet diese.
                |
		    |
		    |
		    v
Worker-Thread ist fertig mit verarbeiten und muss nun wieder
eine Funktion im Haupt-Thread aufrufen (&quot;dispatchen&quot;), Worker-Thread kann sterben
                |
		    |
		    |
		    v
Aufgerufene Funktion muss im Haupt-Thread aufgerufen werden,
verarbeitet neu erstellte Daten aus dem Worker-Thread, die übergeben werden sollten
                |
		    |
		    |
		    v
Funktion unter Haupt-Thread versendet neue Daten via Socket (send)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2231645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231645</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 10 Jul 2012 14:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 15:56:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a>: Es geht um einen Server, der als SCGI Server fungiert und mehrere Scriptsprachen einbindet. Der Apache Webserver schickt also Daten an meinen Server, dieser wertet diese aus dem Protokoll aus und erstellt die Instanz der Klasse Data (wie im vorherigen Beitrag angegeben). Danach soll in dem Worker-Thread ein Interpreter für die jeweilige Scriptsprache gestartet werden. Da das Script natürlich blockieren kann (große Dateien, Schleifen, SQL, ...) muss es in einen eigenen Thread. Anschließend müssen die geparsten Daten (der &quot;Output&quot;) wieder an den Haupt-Thread, damit diese wiederum in das SCGI Protokoll zurück transferiert werden können, um die Daten schließlich abzusenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231662</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 10 Jul 2012 15:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Tue, 10 Jul 2012 16:33:00 GMT]]></title><description><![CDATA[<p>Also mach eine Queue in die die Worker-Threads reinschreiben und wo der Main-Thread rausliest.<br />
Oder du lagerst das Schreiben von Antworten in einen eigenen Thread aus, der sonst nix macht.<br />
Dann hätte jeder Thread genau eine Aufgabe.</p>
<p>Der Main-Thread liest SCGI Requests vom Webserver und erzeugt die Worker-Threads (bzw. verteilt die Requests an gepoolte Worker-Threads - was auch immer).<br />
Die Worker-Threads bauen aus den Requests Antworten und stecken sie in die Antwort-Queue.<br />
Und der Antwort-Schreibe-Thread nimmt die Antworten aus der Antwort-Queue und schickt sie zurück an den Webserver.</p>
<p>Die Queue implementierst du klassisch mit den Funktionen der Threading-API die du verwendest, also mit z.B. Mutex + Condition-Variable, Critical-Section + Event oder was du halt zur Verfügung hast.</p>
<p>Viel einfacher und sauberer als das wird es nicht.</p>
<p>Dass die Mutex Locks dabei blockierend sind sollte egal sein, da die Locks immer nur für einen sehr kurzen Zeitraum gehalten werden. Das .NET Framework macht im Hintergrund auch nix anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231679</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Jul 2012 16:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 12:01:58 GMT]]></title><description><![CDATA[<p>Grandios - habe mich mal etwas reingelesen ins Pooling und in die Arbeit mit Queues. Dann habe ich irgendwann die Lock-Free-Queues entdeckt, um zwei Stunden später festzustellen, dass sie für meine Situation ein viel zu großes Problem darstellen. <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>Da Mutexes also weniger schlimm sind als ich bisher immer dachte (ich dachte, dass sie viel länger blockieren), bin ich mit einer solchen Lösung voll zufrieden: <a href="http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html" rel="nofollow">http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html</a> (siehe unten bei &quot;The Final Code&quot;).</p>
<p>Das einzige Problem an dieser Implementierung ist die Benutzung von Boost. Ich möchte diese Library nicht verwenden, auch wenn sie oft als &quot;well-known&quot; und als quasi-standard betrachtet wird.</p>
<p>Gibt es vergleichbare Implementation dazu, ohne Boost? boost::mutex &amp; boost::mutex::scoped_lock sind ja relativ einfach zu ersetzen. Nur wie man boost::condition_variable umsetzt, erschließt sich mir nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231866</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 11 Jul 2012 12:01:58 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 12:31:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Gibt es vergleichbare Implementation dazu, ohne Boost?</p>
</blockquote>
<p>Ja, klar.<br />
Dazu müsste man aber erstmal wissen was für eine Threading-API du verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231875</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 12:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 12:40:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>grundsätzlich bleibe ich erst einmal auf Windows, und möchte das später auch auf Linux machen (erst einmal zweitrangig). Also für mich wäre eine systemnahe Implementation am interessantesten, um zu lernen, wie ich damit umzugehen habe...</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231882</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 11 Jul 2012 12:40:46 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 13:47:20 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>grundsätzlich bleibe ich erst einmal auf Windows</p>
</blockquote>
<p>Dann schau dir die Doku zu<br />
CreateMutex<br />
WaitForSingleObject<br />
ReleaseMutex<br />
an.</p>
<p>Ich würde dennoch mit boost threads arbeiten. Spart ne Menge Arbeit und gibt dir genug verstädnis für die Materie. IMHO ist boost thread sogar besser, weil du nicht durch Implementierungsdetails abgelenkt bist. Ein boost mutex ist zB viel schöner und klarer als ein Win32 mutex <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2231912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231912</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 11 Jul 2012 13:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 13:54:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>zu spät - ich habe den Sinn von Condition Variables und Mutexes (bzw. den Vorteil von Critical Sections unter Windows) nun verstanden und konnte daher eigene Wrapper implementieren.</p>
<p>Wenn ich nachher die Möglichkeit habe, das Ganze hochzuladen, werde ich das tun, falls Interesse besteht (und damit eventuell mal einer kurz rüberschauen kann).</p>
<p>Danke an alle <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich finde es übrigens lustig, dass so etwas Essentielles erst ab Windows Vista verfügbar ist <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="😮"
    /> (also nativ implementiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231915</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 11 Jul 2012 13:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 13:59:52 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ich finde es übrigens lustig, dass so etwas Essentielles erst ab Windows Vista verfügbar ist <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="😮"
    /> (also nativ implementiert)</p>
</blockquote>
<p>Was meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231917</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 11 Jul 2012 13:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 14:06:12 GMT]]></title><description><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx" rel="nofollow">Siehe MSDN</a>:</p>
<blockquote>
<p>Windows Server 2003 and Windows XP: Condition variables are not supported.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2231919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231919</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 11 Jul 2012 14:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 17:24:34 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>ich habe den Sinn von Condition Variables und Mutexes (bzw. den Vorteil von Critical Sections unter Windows)</p>
</blockquote>
<p>Nur ein Hinweis: Critical Sections unter Windows *sind* Mutexen. Bloss ein anderer Name, und man kann sie halt nicht prozessübergreifend verwenden.<br />
Das was Windows &quot;Mutex&quot; nennt ist ein Kernel-Objekt, und als solches ziemlich langsam.</p>
<blockquote>
<p>Wenn ich nachher die Möglichkeit habe, das Ganze hochzuladen, werde ich das tun, falls Interesse besteht (und damit eventuell mal einer kurz rüberschauen kann).</p>
</blockquote>
<p>Tu das, drüberschauen kann ich auf jeden Fall mal.</p>
<blockquote>
<p>Ich finde es übrigens lustig, dass so etwas Essentielles erst ab Windows Vista verfügbar ist <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="😮"
    /> (also nativ implementiert)</p>
</blockquote>
<p>Naja, Windows hat statt Condition-Variablen sog. &quot;Events&quot; angeboten. Mit denen kann man auch ganz gut arbeiten, allerdings nicht ganz so unkompliziert und problemlos wie mit Condition-Variablen.</p>
<p>Weil auf quasi allen nicht-Windows Systemen aber Condition-Variablen &quot;Standard&quot; sind, und es auch nicht ganz trivial ist Condition-Variablen mit Windows Boardmnitteln (also Critical-Sections, Events etc.) performant und korrekt nachzubilden, hat MS mit Windows Vista endlich &quot;native&quot; Condition-Variablen nachgereicht. Damit Windows auch endlich Condition-Variablen hat, und die Protierung von Projekten auf Windows einfacher wird.</p>
<p>Wenn Support für XP/2003 für dich nicht wichtig ist dann nimm einfach die native Windows Condition-Variablen. Wenn Support für XP/2003 doch wichtig ist, dann würde ich auch zu Boost.Thread, Qt oder einer anderen Library raten, die Condition-Variablen unter Windows XP/2003/... anbietet.<br />
Weil es wie gesagt nicht ganz trivial ist das selbst zu stricken, und eine Queue aus der mehrere Threads lesen ist mit Events auch nicht ganz einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231984</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 17:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 17:28:07 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>grundsätzlich bleibe ich erst einmal auf Windows</p>
</blockquote>
<p>Dann schau dir die Doku zu<br />
CreateMutex<br />
WaitForSingleObject<br />
ReleaseMutex</p>
</blockquote>
<p>Verlinkst du absichtlich die Windows XxxMutex Funktionen? Weil die ausser langsam nur langsam sind? Damit du nachher sagen kannst &quot;nimm Boost, dann wird das alles auch viel schneller&quot;? Oder ...?</p>
<p>Oder ist dir nur einfach nicht klar dass es unter Windows Critical-Sections gibt, und dass Critical-Sections Mutexen *sind*, nur eben ... besser als die Kernel-Mutexen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231985</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 17:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 18:06:34 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Verlinkst du absichtlich die Windows XxxMutex Funktionen?</p>
</blockquote>
<p>Es sind Stichworte mit denen man den Rest easy finden kann. Ich haette mir auch raussuchen koennen wie die Critical Sections heissen, war aber dazu zu faul.</p>
<p>Mit der MFC gehts ueber ein CSingleLock aber wie das mit der WinAPI geht, keine Ahnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232003</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 11 Jul 2012 18:06:34 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 19:06:33 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Verlinkst du absichtlich die Windows XxxMutex Funktionen?</p>
</blockquote>
<p>Es sind Stichworte mit denen man den Rest easy finden kann. Ich haette mir auch raussuchen koennen wie die Critical Sections heissen, war aber dazu zu faul.</p>
</blockquote>
<p>Und weil du zu faul warst EnterCriticalSection() und LeaveCriticalSection() zu ergoogeln hast du lieber Critical-Section gleich gar nicht erwähnt?<br />
Wie macht das denn Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232017</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 19:06:33 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 19:22:35 GMT]]></title><description><![CDATA[<p>Wenn du denkst dass Information fehlt, dann ergaenze sie einfach.<br />
Ein Forenpost ist kein Fachartikel - es wird immer Verbesserungen geben und man recherchiert keine 3 Tage fuer den Inhalt. Man schreibt einfach was einem einfaellt und versucht zu helfen.</p>
<p>Wenn du denkst, dass die Information zu Critical Sections wichtig ist, dann schreib sie einfach hin, no biggy <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/2232020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232020</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 11 Jul 2012 19:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 20:29:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur ein Hinweis: Critical Sections unter Windows *sind* Mutexen. Bloss ein anderer Name, und man kann sie halt nicht prozessübergreifend verwenden.<br />
Das was Windows &quot;Mutex&quot; nennt ist ein Kernel-Objekt, und als solches ziemlich langsam.</p>
</blockquote>
<p>Ich weiß, deshalb habe ich ja auch geschrieben:</p>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>(bzw. den Vorteil von Critical Sections unter Windows)</p>
</blockquote>
<p>Trotzdem danke für den Hinweis <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>hustbaer schrieb:</p>
<blockquote>
<p>Tu das, drüberschauen kann ich auf jeden Fall mal.</p>
</blockquote>
<p>Danke, mache ich morgen...</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja, Windows hat statt Condition-Variablen sog. &quot;Events&quot; angeboten. Mit denen kann man auch ganz gut arbeiten, allerdings nicht ganz so unkompliziert und problemlos wie mit Condition-Variablen.</p>
</blockquote>
<p>Okay.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Weil die ausser langsam nur langsam sind?</p>
</blockquote>
<p>In der MSDN steht nur, dass Critical Sections &quot;sligthy faster&quot; sind als Mutexes...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232041</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 11 Jul 2012 20:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 20:47:04 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Weil die ausser langsam nur langsam sind?</p>
</blockquote>
<p>In der MSDN steht nur, dass Critical Sections &quot;sligthy faster&quot; sind als Mutexes...</p>
</blockquote>
<p>Uff. Ich müsste den Unterschied mal ausmessen. Würde mich aber wundern wenn es nur &quot;sligthy&quot; wäre.</p>
<p>Critical-Sections sind Usermode spin-sleep Locks, also das schnellste was man so an nicht spezialisierten Mutexen bauen kann.</p>
<p>Ne Win32 Mutex ist dagegen wie gesagt ein Kernel-Objekt. D.h. es müssen mehrere Dinge passieren wenn man damit was machen will</p>
<ol>
<li>Kernelmode-Transition</li>
<li>Handle-Lookup &amp; Ermittlung des Handle-Typs</li>
<li>Security-Check, inklusive Check ob der aufrufende Prozess überhaupt berechtigt ist mit dem übergebenen HANDLE zu arbeiten</li>
<li>Die eigentliche Aktion</li>
<li>Transition zurück in den Usermode</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2232045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232045</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 20:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 23:09:08 GMT]]></title><description><![CDATA[<p>So. Hab mal nen ganz einfachen Test gemacht - bloss ein Thread, d.h. keine Lock-Contention, einfach nur mal gucken wie schnell man CS vs. Win32-Mutex erzeugen + zerstören kann, dann erzeugen + zerstören mit 1x lock+unlock dazwischen, und dann erzeugen, 10000x lock/unlock dazwischen und dann zerstören:</p>
<p>Mit MSVC 2012 std::chrono::high_resolution_clock (aka. GetSystemTimeAsFileTime()):</p>
<pre><code>class CriticalSectionNoDebugInfo create/destroy = 2929 us (base)
class CriticalSectionNoDebugInfo create/lock/unlock/destroy = 8789 us (base)
class CriticalSectionNoDebugInfo lock/unlock = 47851 us (base)

class CriticalSection create/destroy = 31250 us = 10.6666 * base
class CriticalSection create/lock/unlock/destroy = 35156 us = 3.99998 * base
class CriticalSection lock/unlock = 46875 us = 0.979593 * base

class Win32Mutex create/destroy = 193359 us = 65.9997 * base
class Win32Mutex create/lock/unlock/destroy = 308593 us = 35.111 * base
class Win32Mutex lock/unlock = 1149414 us = 24.0204 * base
</code></pre>
<p>Mit my_highres_clock aka. QueryPerformanceCounter():</p>
<pre><code>class CriticalSectionNoDebugInfo create/destroy = 3691 us (base)
class CriticalSectionNoDebugInfo create/lock/unlock/destroy = 8498 us (base)
class CriticalSectionNoDebugInfo lock/unlock = 46898 us (base)

class CriticalSection create/destroy = 30244 us = 8.19254 * base
class CriticalSection create/lock/unlock/destroy = 34650 us = 4.07736 * base
class CriticalSection lock/unlock = 46955 us = 1.00123 * base

class Win32Mutex create/destroy = 192070 us = 52.0267 * base
class Win32Mutex create/lock/unlock/destroy = 307289 us = 36.1587 * base
class Win32Mutex lock/unlock = 1144865 us = 24.4117 * base
</code></pre>
<p>&quot;sligthy faster&quot; kommt also nicht so ganz hin. &gt; Faktor 20 ist bei mir nicht mehr &quot;sligthy&quot; <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/2232078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232078</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 23:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Wed, 11 Jul 2012 23:18:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<ol start="3">
<li>Security-Check, inklusive Check ob der aufrufende Prozess überhaupt berechtigt ist mit dem übergebenen HANDLE zu arbeiten</li>
</ol>
</blockquote>
<p>OK, &quot;Security-Check&quot; ist Quatsch, der ist nur nötig wenn man versucht ein neues HANDLE zu bekommen, und das tut man bei WaitForSingleObject/ReleaseMutex ja nicht.<br />
Der Check ob der aktuelle Prozess mit diesem HANDLE arbeiten darf ist hier denke ich schon nötig. HANDLE-Werte sind IIRC ja prozessübergreifend, aber nicht jeder Prozess darf mit jedem HANDLE arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232080</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 11 Jul 2012 23:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to Cross-thread calls on Thu, 12 Jul 2012 06:01:45 GMT]]></title><description><![CDATA[<p>Krass o_O Danke für's testen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich werde den Code noch ein bisschen verfeinern und nachher hochladen.<br />
Aber sei gewarnt, ich code seit 3 Tagen mit Notepad++ ohne jede Chance auf einen Compiler. Ich bin schon gespannt, wenn ich das Projekt zum ersten mal durch einen Compiler schiebe <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/2232089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232089</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Thu, 12 Jul 2012 06:01:45 GMT</pubDate></item></channel></rss>