<?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::asio thread-safety]]></title><description><![CDATA[<p>Ist es sicher async_write von mehreren threads aus mit dem gleichen Socket aufzurufen? Muss ich da den Zugriff auf das Socket synchronisieren? Danke...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276602/boost-asio-thread-safety</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 07:31:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276602.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Nov 2010 09:18:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 09:18:53 GMT]]></title><description><![CDATA[<p>Ist es sicher async_write von mehreren threads aus mit dem gleichen Socket aufzurufen? Muss ich da den Zugriff auf das Socket synchronisieren? Danke...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975532</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 05 Nov 2010 09:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 09:41:35 GMT]]></title><description><![CDATA[<p>Das macht doch gar keinen Sinn...<br />
Rufe async_write auf, warte auf die Completion, rufe das nächste async_write auf, etc.</p>
<p><strong>Edit:</strong><br />
Sorry, Frage nicht korrekt gelesen.<br />
Ja, das ist sicher. Dennoch... ein nächstes async_write ist erst sinnvoll nach der letzen Completion.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975536</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 05 Nov 2010 09:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 09:42:44 GMT]]></title><description><![CDATA[<p>Na gut. Wie sähe es denn mit async_write und async_read aus?<br />
Ich frage nach, weil die funktionen ja eigentlich nur einen Job in die Queue tun und das tatsächlich lesen/schreiben in einem asio-internen thread ausgeführt wird. Bei den synchronen Socket-Operationen gehe ich selbstverständlich davon aus, dass sie nicht thread-safe sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975539</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 05 Nov 2010 09:42:44 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 15:09:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie sähe es denn mit async_write und async_read aus?</p>
</blockquote>
<p>Ja, das ist ok.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975549</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 05 Nov 2010 15:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 15:37:28 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<blockquote>
<p>Wie sähe es denn mit async_write und async_read aus?</p>
</blockquote>
<p>Ja, das ist ok.</p>
</blockquote>
<p>Schön, ich glaube es dir. <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="😉"
    /> Hast du den Quellcode untersucht, oder woher beziehst du dein Wissen?</p>
<p>Dann läuft async_read nicht über socket::read_some()/receive(), oder doch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975557</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 05 Nov 2010 15:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 15:45:54 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Ja, das ist sicher. Dennoch... ein nächstes async_write ist erst sinnvoll nach der letzen Completion.</p>
<p>Simon</p>
</blockquote>
<p>Nein, ist es nicht. Wenn mehrere Threads explizit auf dem gleichen Socket rumrödeln, muss man synchronisieren. Steht auch in der Doku, bei <code>ip::&lt;Protokoll&gt;::socket</code> ganz unten unter &quot;Thread Safety&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975566</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 05 Nov 2010 15:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 15:54:51 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Ja, das ist sicher. Dennoch... ein nächstes async_write ist erst sinnvoll nach der letzen Completion.</p>
<p>Simon</p>
</blockquote>
<p>Nein, ist es nicht. Wenn mehrere Threads explizit auf dem gleichen Socket rumrödeln, muss man synchronisieren. Steht auch in der Doku, bei <code>ip::&lt;Protokoll&gt;::socket</code> ganz unten unter &quot;Thread Safety&quot;.</p>
</blockquote>
<p>Aber async_write ist keine Methode des Sockets, sondern eine freie Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975576</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 05 Nov 2010 15:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 20:59:34 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Ja, das ist sicher. Dennoch... ein nächstes async_write ist erst sinnvoll nach der letzen Completion.</p>
<p>Simon</p>
</blockquote>
<p>Nein, ist es nicht. Wenn mehrere Threads explizit auf dem gleichen Socket rumrödeln, muss man synchronisieren. Steht auch in der Doku, bei <code>ip::&lt;Protokoll&gt;::socket</code> ganz unten unter &quot;Thread Safety&quot;.</p>
</blockquote>
<p>Aber async_write ist keine Methode des Sockets, sondern eine freie Funktion.</p>
</blockquote>
<p>Und die funktioniert auch so ganz ohne Socket als Argument, ja?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975747</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 05 Nov 2010 20:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 21:39:23 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Ja, das ist sicher. Dennoch... ein nächstes async_write ist erst sinnvoll nach der letzen Completion.</p>
<p>Simon</p>
</blockquote>
<p>Nein, ist es nicht. Wenn mehrere Threads explizit auf dem gleichen Socket rumrödeln, muss man synchronisieren. Steht auch in der Doku, bei <code>ip::&lt;Protokoll&gt;::socket</code> ganz unten unter &quot;Thread Safety&quot;.</p>
</blockquote>
<p>Aber async_write ist keine Methode des Sockets, sondern eine freie Funktion.</p>
</blockquote>
<p>Und die funktioniert auch so ganz ohne Socket als Argument, ja?</p>
</blockquote>
<p>Vielleicht ruft async_write/read selbst ja gar keine Methode des Sockets auf. Der Aufruf könnte durchaus thread-safe sein. Leider sagt die Doku darüber nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975772</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Fri, 05 Nov 2010 21:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Fri, 05 Nov 2010 21:56:44 GMT]]></title><description><![CDATA[<p>Was meinst Du, wofür der Socket von <code>async_write</code> benötigt wird? Nur so zum Spaß? <code>async_write</code> ist re-entrant und benötigt ein Socket-Objekt zur Arbeit, und das ist eben nicht Threadsicher. Glaub es einfach. <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/1975779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975779</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 05 Nov 2010 21:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 08:02:33 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Was meinst Du, wofür der Socket von <code>async_write</code> benötigt wird? Nur so zum Spaß? <code>async_write</code> ist re-entrant und benötigt ein Socket-Objekt zur Arbeit, und das ist eben nicht Threadsicher. Glaub es einfach. <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>
</blockquote>
<p>async_write() schreibt doch selbst gar nicht auf das Socket, die Funktion kehrt ja immer sofort zurück. Der Schreibvorgang geschieht irgendwo in io_service, unter der Voraussetzung dass run() aufgerufen wurde.<br />
Lies lieber mal selbst die Doku von boost::asio, und täusche nicht Kenntnisse vor die du nicht hast. Trotzdem bin ich dir dankbar dass du in dem Thema postest. <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/1975836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975836</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Sat, 06 Nov 2010 08:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 09:44:02 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Was meinst Du, wofür der Socket von <code>async_write</code> benötigt wird? Nur so zum Spaß? <code>async_write</code> ist re-entrant und benötigt ein Socket-Objekt zur Arbeit, und das ist eben nicht Threadsicher. Glaub es einfach. <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>
</blockquote>
<p>Dann ist sie eben NICHT reentrant. Fachbegriffe nur benützen, wenn man Ahnung hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975869</guid><dc:creator><![CDATA[Korrektor]]></dc:creator><pubDate>Sat, 06 Nov 2010 09:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 09:51:36 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Was meinst Du, wofür der Socket von <code>async_write</code> benötigt wird? Nur so zum Spaß? <code>async_write</code> ist re-entrant und benötigt ein Socket-Objekt zur Arbeit, und das ist eben nicht Threadsicher. Glaub es einfach. <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>
</blockquote>
<p>async_write() schreibt doch selbst gar nicht auf das Socket, die Funktion kehrt ja immer sofort zurück. Der Schreibvorgang geschieht irgendwo in io_service, unter der Voraussetzung dass run() aufgerufen wurde.<br />
Lies lieber mal selbst die Doku von boost::asio, und täusche nicht Kenntnisse vor die du nicht hast. Trotzdem bin ich dir dankbar dass du in dem Thema postest. <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>
</blockquote>
<p>Sorry, aber ich arbeite seit 1.36 mit ASIO und bin sich entsprechend lange in der boost-Mailingliste aktiv. Ich kenne mich also durchaus einigermaßen mit Asio aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975871</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 06 Nov 2010 09:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 10:16:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>:<br />
Theta sagte, async_write() sei thread-safe. Du sagt, es ist es nicht. Aus der Doku lässt sich weder das eine, noch das andere eindeutig ableiten. Vielleicht sollten wir einfach abstimmen? <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="😉"
    /><br />
Aber mal ehrlich: Wenn du so erfahren mit der Library bist, solltest du deine Aussage bezüglich der Threadsicherheit auch nachvollziehbar begründen können, oder nicht? Oder hast du dein Wissen nur vom Hörensagen?</p>
<p>Edit:<br />
Zur Präzisierung: Es geht um die Frage ob async_write() und async_read() von unterschiedlichen Threads aufgerufen werden können, ohne den Zugriff auf das Socket zu synchronisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975878</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Sat, 06 Nov 2010 10:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 15:15:41 GMT]]></title><description><![CDATA[<p>Ist doch eigentlich ganz einfach. Du benutzt einen Socket. Ohne den kannst Du nichts senden, da der Socket die Verbindung dar stellt. Die Socket-Objekte von <code>boost.asio</code> sind explizit NICHT Threadsicher. Das steht, wie bereits gesagt, in der Doku.</p>
<p>Wenn Du jetzt bei gehst, und aus mehreren Threads <code>async_write</code> <em>mit dem gleichen</em> Socket aufrufst, dann ist das ein Problem. Infos über Threadsicherheit müssen für Dinge angegeben werden, die in irgendeiner Form Daten halten welche eben u.U. nicht von mehreren Threads gleichzeitig benutzt werden dürfen - oder eben nicht.</p>
<p>Eine Funktion hält im normalfall selbst keine <em>geteilten</em> Daten (zumidnest sollte sie das nicht). Sie <em>benutzt</em> jedoch u.U. (z.B. in Deinem Fall) welche. In diesem Fall Dein Socket. Und Sockets sind, wie oben geschrieben nun mal nicht threadsicher.<br />
Schlussendlich ruft <code>async_write</code> übrigens auch nur <code>socket::async_write_some</code> auf. Bei bedarf kannst Du Dich selbst davon überzeugen. Das ist lesbarer Template-Code.</p>
<p>Du kannst es ja auch gerne machen wie Du magst. Es sollte nur eine Hilfestellung sein. Ich habe mit <code>boost.asio</code> so meine Erfahrungen gemacht, und bin dabei auch oft auf die Fresse gefallen, was ich Dir eigentlich ersparen wollte...</p>
<p>Das hier...</p>
<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Lies lieber mal selbst die Doku von boost::asio, und täusche nicht Kenntnisse vor die du nicht hast. Trotzdem bin ich dir dankbar dass du in dem Thema postest. <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>
</blockquote>
<p>...finde ich daher etwas unangemessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976116</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 06 Nov 2010 15:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 17:34:45 GMT]]></title><description><![CDATA[<p>Ich kann mich irren... und das scheint hier der Fall gewesen zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976227</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 06 Nov 2010 17:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio thread-safety on Sat, 06 Nov 2010 20:37:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@tachyon</a>:<br />
Du hast völlig recht. async_write() kann aufgrund der Aufrufe von socket::async_write_some() nicht thread-safe sein. Ich war irgendwie zu blöd, das zu realisieren. <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="😞"
    /><br />
Danke für deine Geduld.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976342</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Sat, 06 Nov 2010 20:37:00 GMT</pubDate></item></channel></rss>