<?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[[Problem] boost::thread Programmstruktur]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe hier ein kleines Problem mit meiner Programmstruktur. Ich habe einen Daemon der sich von einem Job-Server neue Jobs holt und diese dann abarbeitet.<br />
Nun möchte ich das ganze so erweitern, das der Daemon mehrere Jobs aufeinmal bearbeiten kann. Ich möchte das jeder Job in einem eigenen Thread abgearbeitet wird.<br />
Ich habe eine große While-Loop welche immer prüft ob neue Jobs vorhanden sind.</p>
<p>Derzeit funktioniert das so. Ich habe einen Thread-Pool (thread_group). In der Main-Loop werden solange Jobs geholt bis entweder keiner mehr vorhanden ist, oder der Thread-Pool voll ist.<br />
Wenn das erledigt ist, joine ich alle threads mit thread_group::join_all(). Und genau hier ist das Problem. thread_group::join_all() ist blocking, was bedeutet, das selbst wenn 3/4 threads fertig sind alles noch blockiert,<br />
was in meinen Augen eine Verschwendung von Zeit und Ressourcen ist.</p>
<p>Wie kann ich also threads asynchron joinen? Die threads müssen untereinander nicht synchronisiert werden (sie teilen sich keine Ressourcen). Ich finde einfach kein Asynchrones äquivalent zu boost::thread::join().</p>
<p>Kann mir eventuell jemand einen Tipp geben, wie man das am besten lösen kann? Meine Boost Kenntnisse sind leider noch nicht so tiefgehend und mir fehlen schlicht weg die Optionen welche ich habe. Kann man da eventuell was mit boost::asio machen?</p>
<p>Danke für die Hilfe</p>
<p>so long</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305606/problem-boost-thread-programmstruktur</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 14:35:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305606.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jul 2012 10:03:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 10:03:25 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe hier ein kleines Problem mit meiner Programmstruktur. Ich habe einen Daemon der sich von einem Job-Server neue Jobs holt und diese dann abarbeitet.<br />
Nun möchte ich das ganze so erweitern, das der Daemon mehrere Jobs aufeinmal bearbeiten kann. Ich möchte das jeder Job in einem eigenen Thread abgearbeitet wird.<br />
Ich habe eine große While-Loop welche immer prüft ob neue Jobs vorhanden sind.</p>
<p>Derzeit funktioniert das so. Ich habe einen Thread-Pool (thread_group). In der Main-Loop werden solange Jobs geholt bis entweder keiner mehr vorhanden ist, oder der Thread-Pool voll ist.<br />
Wenn das erledigt ist, joine ich alle threads mit thread_group::join_all(). Und genau hier ist das Problem. thread_group::join_all() ist blocking, was bedeutet, das selbst wenn 3/4 threads fertig sind alles noch blockiert,<br />
was in meinen Augen eine Verschwendung von Zeit und Ressourcen ist.</p>
<p>Wie kann ich also threads asynchron joinen? Die threads müssen untereinander nicht synchronisiert werden (sie teilen sich keine Ressourcen). Ich finde einfach kein Asynchrones äquivalent zu boost::thread::join().</p>
<p>Kann mir eventuell jemand einen Tipp geben, wie man das am besten lösen kann? Meine Boost Kenntnisse sind leider noch nicht so tiefgehend und mir fehlen schlicht weg die Optionen welche ich habe. Kann man da eventuell was mit boost::asio machen?</p>
<p>Danke für die Hilfe</p>
<p>so long</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229591</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Tue, 03 Jul 2012 10:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 11:32:09 GMT]]></title><description><![CDATA[<p>Mit der Boost-Bibliothek kenn ich mich nicht aus, aber in C++11 gibt es in std::future ein std::async(..), was unter bestimmen Bedingungen einen neuen Thread startet. Du wartest auf so einen std::async thread mit get().</p>
<p>Ist es sowas was du suchst?</p>
<pre><code class="language-cpp">#include &lt;future&gt;
#include &lt;iostream&gt;

int main()
{
auto res=std::async(std::launch::async,[]{int sum=0; for(int i=0;i&lt;50;++i)sum+=i; return sum;});
std::cout&lt;&lt;res.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2229617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229617</guid><dc:creator><![CDATA[Fl0]]></dc:creator><pubDate>Tue, 03 Jul 2012 11:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 11:36:35 GMT]]></title><description><![CDATA[<p>Fl0 schrieb:</p>
<blockquote>
<p>Mit der Boost-Bibliothek kenn ich mich nicht aus, aber in C++11 gibt es in std::future ein std::async(..), was unter bestimmen Bedingungen einen neuen Thread startet. Du wartest auf so einen std::async thread mit get().</p>
</blockquote>
<p>Da die C++11-Threads vomn Design her ziemlich eng an die Boost-Threads angelehnt wurden, wird es dies dort sicherlich auch geben. Jedoch bin ich ebenfalls überfragt, wie dieses Feature dort genau heißt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229618</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Jul 2012 11:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 11:43:51 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Da die C++11-Threads vomn Design her ziemlich eng an die Boost-Threads angelehnt wurden, wird es dies dort sicherlich auch geben. Jedoch bin ich ebenfalls überfragt, wie dieses Feature dort genau heißt.</p>
</blockquote>
<p>Das dachte ich mir auch, weshalb ich das überhaupt gepostet habe. Aber:</p>
<p>Boost schrieb:</p>
<blockquote>
<p>Future<br />
The following features will be included in next releases.</p>
<p>Complete the C++11 missing features, in particular<br />
#4710 Missing async().</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2229622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229622</guid><dc:creator><![CDATA[Fl0]]></dc:creator><pubDate>Tue, 03 Jul 2012 11:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 11:54:36 GMT]]></title><description><![CDATA[<p>Danke für Eure schnelle Hilfe. Aber ich vermute das mein Problem simpler ist.<br />
Mir war nicht klar das ein boost::thread::join() optional ist. Da ich nichts blockieren will, lass ich einfach den join weg und wusch es funktioniert. Ich habe das mit dem Join in der Doku so verstanden, das der Thread erst erstellt wird, wenn ich den Join mache und habe auch schon geschimpft was das sein soll. Ich habe da einfach etwas falsch interpretiert.</p>
<p>Jedoch werde ich mir das was Ihr geschrieben habt auch angucken interessant ist es definitiv.</p>
<p>PS: Die Boost Doku ist teilweise die Hölle <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>so long</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229627</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Tue, 03 Jul 2012 11:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 13:11:44 GMT]]></title><description><![CDATA[<p>Ich würde für sowas boost.asio benutzen. Das Hat das ganze Zeugs fürs Queuen der Jobs und das Verteilen auf Threads schon fertig drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229653</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 03 Jul 2012 13:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Tue, 03 Jul 2012 15:33:27 GMT]]></title><description><![CDATA[<p>Ich vermute mal, dass du bei einem leeren Pool von Threads nicht blockst und dein Prozessor (bzw. ein Kern), auch wenn gar kein Task abgearbeitet wird, auf 100% läuft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229705</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 03 Jul 2012 15:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Wed, 04 Jul 2012 20:45:07 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Ich würde für sowas boost.asio benutzen. Das Hat das ganze Zeugs fürs Queuen der Jobs und das Verteilen auf Threads schon fertig drin.</p>
</blockquote>
<p>Hallo Tachyon,</p>
<p>meinst du alle Operationen dich ich verteilen will (ist nur eine Funktion) einfach via boost::asio asynchron ausführen und boost::asio verteilt dann alles via Threads, falls notwenig selbständig? Falls ja, taugt das was, das ganze boost::asio zu überlassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230137</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Wed, 04 Jul 2012 20:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Wed, 04 Jul 2012 22:55:27 GMT]]></title><description><![CDATA[<p>boost::asio verteilt von selbst gar nix auf Threads.<br />
In der vorgeschlagenen Verwendung ist es nicht viel mehr als fancy Task-Queue.</p>
<p>Die Worker-Threads musst du dabei selbst bereitstellen. D.h. du kannst auch selbst entscheiden wie viele Threads gleichzeitig werken sollen, was die für ne Priorität haben sollen etc.</p>
<blockquote>
<p>Mir war nicht klar das ein boost::thread::join() optional ist.</p>
</blockquote>
<p>Ab Boost 1.50.0 sollte man <code>thread::detach</code> oder <code>thread::join</code> aufrufen bevor man nen <code>boost::thread</code> überschreibt (mit move) oder zerstört. Sonst ruft Boost nämlich <code>std::terminate</code> auf.<br />
Wenn du möchtest dass die Thread weiterlaufen in deinem Fall also <code>thread::detach</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230158</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Jul 2012 22:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Problem] boost::thread Programmstruktur on Thu, 05 Jul 2012 16:58:38 GMT]]></title><description><![CDATA[<p>Hallo hustbaer,</p>
<p>ich danke dir für die Erklärung, das Thema ist doch interessanter als ich gedacht habe. Ich werde mich damit mal etwas näher beschäftigen. Ein Einsatzgebiet ist ja auch schon vorhanden.</p>
<p>so long</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230403</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Thu, 05 Jul 2012 16:58:38 GMT</pubDate></item></channel></rss>