<?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 threads]]></title><description><![CDATA[<p>Hallo,</p>
<p>wer kennt sich mit boost threads aus?</p>
<p>Ich würde gerne boost threads in meiner Applikation verwenden. Nur habe ich ein kleines Problem. Ich möchte in einer Klasse den Thread als membervariable (evtl. als shared_ptr) erzeugen. Dieser soll von außerhalb (aus einer anderen klasse) beendet (also angehalten) und neu gestartet werden.</p>
<p>Angenommen ich habe einen boost::thread als shared pointer m_pthread:<br />
Könnte es hier ein Problem geben?</p>
<pre><code class="language-cpp">void thread_function()
{
    while(!m_bStop)
    {
    }
}

void startThread()
{
    if(!m_pthread)
    {
        m_bStop = false;
        m_pthread(new boost::thread(thread_function)
    }
}

void stopThread()
{
    m_bStop = true;
    m_pthread-&gt;join()
}
</code></pre>
<p>Ich bin mir in einigen Dingen unsicher:<br />
1. Ist das Starten des threads und das Stoppen richtig umgesetzt?<br />
2. Wie stellt man fest, ob ein thread bereits erstellt ist?<br />
3. Kann ich davon ausgehen, dass der heap nach dem join() und dem return aus der while schleife aufgeräumt ist?<br />
3. Gibt es sonst noch Probleme, die euch einfallen?<br />
4. Machen Shared Pointer hier überhaupt Sinn???</p>
<p>Vielen Dank Euch und noch einen schönen Abend!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267498/boost-threads</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 11:57:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267498.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 May 2010 18:47:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost threads on Tue, 25 May 2010 18:47:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wer kennt sich mit boost threads aus?</p>
<p>Ich würde gerne boost threads in meiner Applikation verwenden. Nur habe ich ein kleines Problem. Ich möchte in einer Klasse den Thread als membervariable (evtl. als shared_ptr) erzeugen. Dieser soll von außerhalb (aus einer anderen klasse) beendet (also angehalten) und neu gestartet werden.</p>
<p>Angenommen ich habe einen boost::thread als shared pointer m_pthread:<br />
Könnte es hier ein Problem geben?</p>
<pre><code class="language-cpp">void thread_function()
{
    while(!m_bStop)
    {
    }
}

void startThread()
{
    if(!m_pthread)
    {
        m_bStop = false;
        m_pthread(new boost::thread(thread_function)
    }
}

void stopThread()
{
    m_bStop = true;
    m_pthread-&gt;join()
}
</code></pre>
<p>Ich bin mir in einigen Dingen unsicher:<br />
1. Ist das Starten des threads und das Stoppen richtig umgesetzt?<br />
2. Wie stellt man fest, ob ein thread bereits erstellt ist?<br />
3. Kann ich davon ausgehen, dass der heap nach dem join() und dem return aus der while schleife aufgeräumt ist?<br />
3. Gibt es sonst noch Probleme, die euch einfallen?<br />
4. Machen Shared Pointer hier überhaupt Sinn???</p>
<p>Vielen Dank Euch und noch einen schönen Abend!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902450</guid><dc:creator><![CDATA[Max0]]></dc:creator><pubDate>Tue, 25 May 2010 18:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 07:51:06 GMT]]></title><description><![CDATA[<p>Wieso probierst Du es nicht einfach aus?</p>
<p>Ansonsten:<br />
Ich würde nicht <code>while(!stop)</code> , sondern <code>while(running)</code> benutzen.</p>
<ol>
<li><code>startThread()</code> wird so nicht kompilieren, <code>stopThread()</code> ist so okay.</li>
<li>Am Besten gar nicht. Du kannst <code>boost::thread</code> direkt als Member Deiner Klasse benutzen. Wenn Du wissen willst, ob eine Funktion im Threadobjekt aktiv ist, kannst Du z.B. <code>thread::joinable()</code> befragen.</li>
<li>Wovon soll der Heap geräumt werden? Vom Threadobjekt? Siehe Punk 2.</li>
<li>Nicht für diesen Codeschnippsel.</li>
<li>Nein.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1902584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902584</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 26 May 2010 07:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 08:17:11 GMT]]></title><description><![CDATA[<p>Da das Setzen/Lesen einer Variablen nicht unbedingt atomar sein muss empfehle ich statt des bools ein Event. Ich weiss leider nicht, ob boost so etwas anbietet/kapselt, aber mit der Win32 ginge das so:</p>
<pre><code class="language-cpp">class MyClass
{
   HANDLE StopEvent_;

public:
   MyClass()
   {
      StopEvent_ = CreateEvent( 0,      // Security Attributes: use default
                                TRUE,   // manual reset
                                FALSE,  // initial state
                                0 );    // Name
   }

   ~MyClass()
   {
      if( StopEvent_ )
      {
         CloseHandle( StopEvent_ );
      }
   }

   void thread_function()
   {
      // Schleife durchlaufen, solange das Stopp Event nicht gesetzt ist
      while( WaitObject( StopEvent_, 0 ) != WAIT_OBJECT_0)
      {
      }
   }

   void start_thread()
   {
      if( StopEvent_ )
      {
         // Stopp Event zurücksetzen
         ResetEvent( StopEvent_ );
         ...
      }
   }

   void stop_thread()
   {
      if( StopEvent_ )
      {
         // Stopp Event setzen
         SetEvent( StopEvent_ );
         ...
      }
   }

private:
  // Kopien verbieten
  MyClass( const MyClass&amp; );
  MyClass&amp; operator=( const MyClass&amp; );
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1902598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902598</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 26 May 2010 08:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 08:19:46 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Da das Setzen/Lesen einer Variablen nicht unbedingt atomar sein muss...</p>
</blockquote>
<p>Und das ist für die Run-Condition genau weshalb ein Problem? Vor allem, weil <code>join()</code> als Barriere fungiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902600</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 26 May 2010 08:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 09:02:20 GMT]]></title><description><![CDATA[<p>Das Problem an deinem Ansatz ist, dass in der Threadfunktion m_bStop nicht direkt verfügbar ist. Es sei denn, thread_function ist ein member einer Klasse, dan müsstes du dem Thread allerdings ein Funktionsobjekt übergeben, bei dem mit boost::bind das Klassenobjekt an die thread_function methode gebunden wurde.<br />
Im Normalfall werden solche Benachrichtigungen für Threads über boost::conditionvariable_any gesteuert, die sind genau zu dem Zweck gedacht und ihre Änderungen sid auch atomar.<br />
Alternativ kannst du dem Thread einen interrupt schicken, dann wird im Thread eine interrupt_exception geschmissen (nur an bestimmten Stellen). Wie das genau abläuft steht in der boost::thread doku.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902616</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 26 May 2010 09:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 10:03:35 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>DocShoe schrieb:</p>
<blockquote>
<p>Da das Setzen/Lesen einer Variablen nicht unbedingt atomar sein muss...</p>
</blockquote>
<p>Und das ist für die Run-Condition genau weshalb ein Problem? Vor allem, weil <code>join()</code> als Barriere fungiert.</p>
</blockquote>
<p>Kenn´ ich den ganzen Code der Thread Klasse? Vielleicht gibt es ja diese Methode:</p>
<pre><code class="language-cpp">bool is_running() const
{
   return !m_bStop;
}
</code></pre>
<p>Damit lässt sich ein Fall konstruieren, in dem der Thread noch läuft, sich selbst aber als angehalten meldet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902651</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 26 May 2010 10:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 16:12:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>eine Zwischenfrage sei mir gestattet...</p>
<p>was bedeutet denn &quot;atomare Änderung&quot;? Kann mir grad nichts darunter vorstellen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <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>
<p>Danke euch</p>
<p>Gruß<br />
Jodi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902826</guid><dc:creator><![CDATA[J0di]]></dc:creator><pubDate>Wed, 26 May 2010 16:12:09 GMT</pubDate></item><item><title><![CDATA[Reply to boost threads on Wed, 26 May 2010 19:44:25 GMT]]></title><description><![CDATA[<p>J0di schrieb:</p>
<blockquote>
<p>was bedeutet denn &quot;atomare Änderung&quot;? Kann mir grad nichts darunter vorstellen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <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>Das ist eine Änderung, welche komplett geschieht, ohne dass sie unterbrochen wird. Oftmals bestehen Betriebssystemspezifische Funktionen, um solche atomischen Veränderungen zu machen.<br />
z.B findest du unter Windows sehr viele hier (die Interlocked Sachen):<br />
<a href="http://msdn.microsoft.com/en-us/library/ms686360%28v=VS.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms686360(v=VS.85).aspx</a></p>
<p>Wenn es kompliziertere Sachen sein sollen, dann kommst du um eigene Synchronisation nicht herum (Semaphore, Monitore usw.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902921</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 26 May 2010 19:44:25 GMT</pubDate></item></channel></rss>