<?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 signals2 thread-safty]]></title><description><![CDATA[<p>hey leute,<br />
hab mal wieder ein (wahrscheinlich dämliches) problem.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/signals2/signal.hpp&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;stdio.h&gt;

// nur zum testwarten
void wait (int seconds) {
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() &lt; endwait) {}
}

struct HelloWorld {
  int i;
  boost::signals2::signal&lt;void ()&gt; sig;
  void doit() {   // eigentlicher ablauf
    i++;
    wait(3);
    std::cout &lt;&lt; &quot;Hello, World! &quot; &lt;&lt; i &lt;&lt; std::endl;
  }
  void send() {   // signal sender
    sig();
  }
  void operator()() { // startet signal im neuen thread
   boost::thread t(boost::bind(&amp;HelloWorld::send, this));
  }
};

int main() {

  HelloWorld hello;
  hello.i=0;

  hello.sig.connect(boost::bind(&amp;HelloWorld::doit, &amp;hello));

    std::cout &lt;&lt; &quot;before&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after1&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after2&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after3&quot; &lt;&lt; std::endl;
   //t.join();
   wait(5);

  return 0;
};
</code></pre>
<p>und zwar steht in der beschreibung von signals2 das es threadsicher ist, jedoch ist die ausgabe</p>
<pre><code>before
after1
after2
after3
Hello, World! Hello, World! 3
3
Hello, World! 3
</code></pre>
<p>die idee ist es das bei einem aufruf einer funktion ein signal gesendet wird, jedoch nicht auf das beenden des signals gewartet wird. deswegen lagere ich es in einen thread aus. kann mir da einer vllt sagen wo der fehler liegt?</p>
<p>die ausgabe sollte dann</p>
<pre><code>before
after1
after2
after3
hello, world! 1
hello, world! 2
hello, world! 3
</code></pre>
<p>sein.<br />
gruß pete</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279755/boost-signals2-thread-safty</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 10:09:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279755.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Jan 2011 11:53:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 11:54:24 GMT]]></title><description><![CDATA[<p>hey leute,<br />
hab mal wieder ein (wahrscheinlich dämliches) problem.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/signals2/signal.hpp&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;stdio.h&gt;

// nur zum testwarten
void wait (int seconds) {
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() &lt; endwait) {}
}

struct HelloWorld {
  int i;
  boost::signals2::signal&lt;void ()&gt; sig;
  void doit() {   // eigentlicher ablauf
    i++;
    wait(3);
    std::cout &lt;&lt; &quot;Hello, World! &quot; &lt;&lt; i &lt;&lt; std::endl;
  }
  void send() {   // signal sender
    sig();
  }
  void operator()() { // startet signal im neuen thread
   boost::thread t(boost::bind(&amp;HelloWorld::send, this));
  }
};

int main() {

  HelloWorld hello;
  hello.i=0;

  hello.sig.connect(boost::bind(&amp;HelloWorld::doit, &amp;hello));

    std::cout &lt;&lt; &quot;before&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after1&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after2&quot; &lt;&lt; std::endl;
  hello();
    std::cout &lt;&lt; &quot;after3&quot; &lt;&lt; std::endl;
   //t.join();
   wait(5);

  return 0;
};
</code></pre>
<p>und zwar steht in der beschreibung von signals2 das es threadsicher ist, jedoch ist die ausgabe</p>
<pre><code>before
after1
after2
after3
Hello, World! Hello, World! 3
3
Hello, World! 3
</code></pre>
<p>die idee ist es das bei einem aufruf einer funktion ein signal gesendet wird, jedoch nicht auf das beenden des signals gewartet wird. deswegen lagere ich es in einen thread aus. kann mir da einer vllt sagen wo der fehler liegt?</p>
<p>die ausgabe sollte dann</p>
<pre><code>before
after1
after2
after3
hello, world! 1
hello, world! 2
hello, world! 3
</code></pre>
<p>sein.<br />
gruß pete</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001632</guid><dc:creator><![CDATA[itwasntpete]]></dc:creator><pubDate>Mon, 03 Jan 2011 11:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 12:16:49 GMT]]></title><description><![CDATA[<p>Was hat thread-Sicherheit mit der Rehenfolge zu tun? Wenn du nicht selber im Programm dafür sorgst, dass deine gewünschte Reihenfolge erzeugt wird, ist sie zufällig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001646</guid><dc:creator><![CDATA[Manni66]]></dc:creator><pubDate>Mon, 03 Jan 2011 12:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 12:26:53 GMT]]></title><description><![CDATA[<p>Keine Ahnung, aber sich and saftyge Threads wagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001653</guid><dc:creator><![CDATA[ohhjää]]></dc:creator><pubDate>Mon, 03 Jan 2011 12:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 12:40:22 GMT]]></title><description><![CDATA[<p>was für ne reihenfolge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001662</guid><dc:creator><![CDATA[itwasntpete]]></dc:creator><pubDate>Mon, 03 Jan 2011 12:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 12:52:29 GMT]]></title><description><![CDATA[<p>Was ist eine Klasse/Struct? Was ist ein Thread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001676</guid><dc:creator><![CDATA[ohhjää]]></dc:creator><pubDate>Mon, 03 Jan 2011 12:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 13:21:59 GMT]]></title><description><![CDATA[<p>Deine Funktionen (=Slots) sind nicht threadsicher.<br />
Bei <code>signals2</code> werden mit nichten die Slots automatisch synchronisiert. Nur die Verwaltung der Verbindungen wird synchronisiert. Du kannst nebenläufig <em>Slots verbinden und trennen</em>, ohne Dir Gedanken über Threadsicherheit machen zu müssen. Deine Funktionen (sprich, das Initiieren von Signalen und die dadurch ablaufenden Funktionen) werden dadurch aber nicht threadsicher. Zumindest nicht so, wie Du es machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001694</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 Jan 2011 13:21:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Mon, 03 Jan 2011 14:28:10 GMT]]></title><description><![CDATA[<p>hab mir schon gedacht das ich das falsch verstanden haben. dachte ich könnte mit signals auf mutex verzichten. dem ist wohl nicht so. danke tachyon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001752</guid><dc:creator><![CDATA[itwasntpete]]></dc:creator><pubDate>Mon, 03 Jan 2011 14:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Tue, 04 Jan 2011 02:14:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Du kannst nebenläufig Slots verbinden und trennen, ohne Dir Gedanken über Threadsicherheit machen zu müssen.</p>
</blockquote>
<p>Ich vermute du meinst das richtige, aber die Aussage stimmt so nicht ganz.</p>
<p>Man kann nämlich schnell ein Problem bekommen, wenn man eine Connection auf eine Memberfunktion im Destruktor des Objekts trennt, während aus einem anderen Thread das Signal aufgerufen wird.<br />
Das &quot;disconnect&quot; kann nämlich vollständig ausgeführt werden, während der eigene Handler noch läuft. So löscht man der Memberfunktion das Objekt unterm Hintern weg. Nicht gut.</p>
<p>&quot;Ohne sich Gedanken zu machen&quot; ist daher IMO einigermassen irreführend, da das beschriebene wohl kein ganz seltenes Szenario sein wird.<br />
(Zumindest ich habe es schon mehrfach gebraucht - hatte ja diesbezüglich auch kürzlich hier gefragt wegen Binden von &quot;this&quot; als weak_ptr)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002042</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Jan 2011 02:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to boost signals2 thread-safty on Tue, 04 Jan 2011 07:59:46 GMT]]></title><description><![CDATA[<p>Gab es dafür nicht die scoped connections? Also zum schließen einer Verbindung z.B. beim Zerstören eines Objekts?<br />
Ansonsten: Ja hast recht. Ich meinte eigentlich, dass nur das Verbinden/Trennen von Verbindungen sicher ist. Wenn man nebenläufig noch aktive Signale hat, muss man aufpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002060</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 04 Jan 2011 07:59:46 GMT</pubDate></item></channel></rss>