<?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[Threads]]></title><description><![CDATA[<p>Hallo,<br />
hier noch ein Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/thread.hpp&gt;
#include &lt;iostream&gt;
using namespace std;

// zur Erkl‰rung der Funktion von reference_wrapper, siehe Text
template&lt;class Callee&gt;
class CallWrapper {
public:
   CallWrapper(Callee&amp; c) : callee(c) {}
   void operator()() {
      callee();
   }
private:
   Callee&amp; callee;
};

class Worker {
public:
   Worker()
      : pause(false), beendet(false) {
   }
   void operator()() {
      while(!beendet) {
         cout &lt;&lt; &quot;Worker bei der Arbeit!&quot; &lt;&lt; endl;
         pauseOderNicht();
         boost::this_thread::sleep(boost::posix_time::seconds(1));
      }
      cout &lt;&lt; &quot;Worker macht Feierabend!&quot; &lt;&lt; endl;
   }
   void warten() {
      boost::lock_guard&lt;boost::mutex&gt; lock(mtxPause);
      pause = true;
   }
   void weiter() {
      boost::lock_guard&lt;boost::mutex&gt; lock(mtxPause);
      pause = false;
      cond.notify_one();
   }
   void beenden() {
      beendet = true;
      cond.notify_one(); // ... falls im Zustand pausierend
   }
   bool istBeendet() {
      return beendet;
   }
private:
   bool pause;
   bool beendet;
   boost::mutex mtxPause;
   boost::condition_variable cond;

   void pauseOderNicht() {
      boost::mutex mtx;
      boost::unique_lock&lt;boost::mutex&gt; lock(mtx);
      while(pause &amp;&amp; !beendet) {
         cout &lt;&lt; &quot;Worker pausiert!&quot; &lt;&lt; endl;
         cond.wait(lock);
         cout &lt;&lt; &quot;Worker macht weiter!&quot; &lt;&lt; endl;
      }
   }
};

int main() {
   Worker worker;
   CallWrapper&lt;Worker&gt; aufrufer(worker);
   boost::thread t(aufrufer);
   int stunde = 8;
   while(!worker.istBeendet()) {
      boost::this_thread::sleep(boost::posix_time::seconds(1));
      cout &lt;&lt; ++stunde &lt;&lt; &quot; Uhr: &quot;;
      switch(stunde) {
      case 10 : worker.warten();          // Pause
         break;
      case 13 : worker.weiter();          // Fortsetzung
         break;
      case 16:  worker.beenden();         // Ende
         t.join();                        // Ende abwarten
         break;
      default: if(stunde &gt; 16) {
            throw &quot;Fehler!&quot;;
         }
      }
   }
}
</code></pre>
<p>Wodurch ist hier gewährleistet, dass zuerst die Urzeit, und dann die Tätigkeit ausgegeben wird, z.B.<br />
9Uhr: Worker bei der Arbeit und nicht<br />
Worker bei der Arbeit 9Uhr:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263558/threads</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 16:10:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263558.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Mar 2010 18:34:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads on Mon, 22 Mar 2010 18:34:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
hier noch ein Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/thread.hpp&gt;
#include &lt;iostream&gt;
using namespace std;

// zur Erkl‰rung der Funktion von reference_wrapper, siehe Text
template&lt;class Callee&gt;
class CallWrapper {
public:
   CallWrapper(Callee&amp; c) : callee(c) {}
   void operator()() {
      callee();
   }
private:
   Callee&amp; callee;
};

class Worker {
public:
   Worker()
      : pause(false), beendet(false) {
   }
   void operator()() {
      while(!beendet) {
         cout &lt;&lt; &quot;Worker bei der Arbeit!&quot; &lt;&lt; endl;
         pauseOderNicht();
         boost::this_thread::sleep(boost::posix_time::seconds(1));
      }
      cout &lt;&lt; &quot;Worker macht Feierabend!&quot; &lt;&lt; endl;
   }
   void warten() {
      boost::lock_guard&lt;boost::mutex&gt; lock(mtxPause);
      pause = true;
   }
   void weiter() {
      boost::lock_guard&lt;boost::mutex&gt; lock(mtxPause);
      pause = false;
      cond.notify_one();
   }
   void beenden() {
      beendet = true;
      cond.notify_one(); // ... falls im Zustand pausierend
   }
   bool istBeendet() {
      return beendet;
   }
private:
   bool pause;
   bool beendet;
   boost::mutex mtxPause;
   boost::condition_variable cond;

   void pauseOderNicht() {
      boost::mutex mtx;
      boost::unique_lock&lt;boost::mutex&gt; lock(mtx);
      while(pause &amp;&amp; !beendet) {
         cout &lt;&lt; &quot;Worker pausiert!&quot; &lt;&lt; endl;
         cond.wait(lock);
         cout &lt;&lt; &quot;Worker macht weiter!&quot; &lt;&lt; endl;
      }
   }
};

int main() {
   Worker worker;
   CallWrapper&lt;Worker&gt; aufrufer(worker);
   boost::thread t(aufrufer);
   int stunde = 8;
   while(!worker.istBeendet()) {
      boost::this_thread::sleep(boost::posix_time::seconds(1));
      cout &lt;&lt; ++stunde &lt;&lt; &quot; Uhr: &quot;;
      switch(stunde) {
      case 10 : worker.warten();          // Pause
         break;
      case 13 : worker.weiter();          // Fortsetzung
         break;
      case 16:  worker.beenden();         // Ende
         t.join();                        // Ende abwarten
         break;
      default: if(stunde &gt; 16) {
            throw &quot;Fehler!&quot;;
         }
      }
   }
}
</code></pre>
<p>Wodurch ist hier gewährleistet, dass zuerst die Urzeit, und dann die Tätigkeit ausgegeben wird, z.B.<br />
9Uhr: Worker bei der Arbeit und nicht<br />
Worker bei der Arbeit 9Uhr:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872646</guid><dc:creator><![CDATA[Thomas22]]></dc:creator><pubDate>Mon, 22 Mar 2010 18:34:28 GMT</pubDate></item><item><title><![CDATA[Reply to Threads on Tue, 23 Mar 2010 01:41:30 GMT]]></title><description><![CDATA[<p>äh<br />
garnicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872776</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Mar 2010 01:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Threads on Tue, 23 Mar 2010 09:00:46 GMT]]></title><description><![CDATA[<p>Also das Beispiel ist nicht von mir, sondern aus einem Buch. Aber komischerweise kam die Ausgabe immer korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872819</guid><dc:creator><![CDATA[Thomas22]]></dc:creator><pubDate>Tue, 23 Mar 2010 09:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Threads on Tue, 23 Mar 2010 09:02:45 GMT]]></title><description><![CDATA[<p>Thomas22 schrieb:</p>
<blockquote>
<p>Also das Beispiel ist nicht von mir, sondern aus einem Buch. Aber <strong>aus Zufall</strong> kam die Ausgabe immer korrekt.</p>
</blockquote>
<p>Fixed.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872820</guid><dc:creator><![CDATA[Bugfixer]]></dc:creator><pubDate>Tue, 23 Mar 2010 09:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Threads on Tue, 23 Mar 2010 14:23:14 GMT]]></title><description><![CDATA[<p>Thomas22 schrieb:</p>
<blockquote>
<p>Also das Beispiel ist nicht von mir, sondern aus einem Buch. Aber komischerweise kam die Ausgabe immer korrekt.</p>
</blockquote>
<p>Kann ich auch nix dafür.<br />
Das Beispiel ist Müll, ob es nun von dir ist oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872961</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Mar 2010 14:23:14 GMT</pubDate></item></channel></rss>