<?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[Socket sauber runter fahren: Problem mit Boost, Thread und Blocking Function]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe einen TCP-Server der mehrere Sockets verwalten kann, da klappt alles super, nun habe ich ein TTL (Time To Live) eingebaut, der angibt, wie lange ein Socket unbenutzt leben darf. Klappt auch alles soweit ganz gut nur habe ich das Problem den Socket nach ablauf des TTL &quot;sauber&quot; runter zu fahren. Habe ehr den eindruck das ich den &quot;hart&quot; abstürzen lasse. Hier mal mein Code:</p>
<pre><code class="language-cpp">connection::~connection()
{
    log&amp; log_ = log::getInstance(server_settings_);
    log_.write(&quot;connection closed: &quot;+unique_id_, log::DEBUG);
}

void connection::handle_read(const boost::system::error_code&amp; error, std::size_t bytes_transferred)
{
    ttl_is_running_ = true;
    ttl_thread_.interrupt();
    ttl_thread_ = boost::thread(boost::bind(&amp;connection::run_ttl, shared_from_this()));
}
void connection::stop()
{
    log&amp; log_ = log::getInstance(server_settings_);
    log_.write(&quot;stop have been called: &quot;+unique_id_, log::DEBUG);
    ttl_is_running_ = false;
    boost::lock_guard&lt;boost::mutex&gt; lock(ttl_mutex_);
    ttl_break_condition_.notify_one();
    ttl_thread_.join();
    socket_.close();
}

void connection::run_ttl()
{
    boost::unique_lock&lt;boost::mutex&gt; lock(ttl_mutex_);
    log&amp; log_ = log::getInstance(server_settings_);
    try {
        do {
	    log_.write(&quot;ttl have been started: &quot;+unique_id_, log::DEBUG);
	    ttl_is_running_ = false;
	} while (!ttl_break_condition_.timed_wait(lock, boost::posix_time::seconds(15)) &amp;&amp; ttl_is_running_);
        log_.write(&quot;ttl have been expired: &quot;+unique_id_, log::DEBUG);
	connection_manager_.stop(shared_from_this());
    } catch (boost::thread_interrupted&amp;) {
        log_.write(&quot;ttl have been aborted: &quot;+unique_id_, log::DEBUG);
    }
}
</code></pre>
<p>run_ttl: &lt;-- ist die funktion des TTL die via Thread ausgeführt wird.<br />
stop: &lt;-- schließt den Socket<br />
connection_managet_: &lt;-- hält alle Sockets in einem Container</p>
<p>Die ist mal ein ausschnitt von einem Socket. Immer wenn man etwas an den Server schickt, wird der aktuelle boost::thread angehalten und neu gestared, damit bezwecke ich das der TTL von vorne beginnt. Dies passiert in der handle_read - Funktion</p>
<p>Wenn der TTL abgelaufen ist, soll der Socket geschlossen werden und saubet entfernt werden, das bedeutet das ich das über meinen Connection Manager macher da dieser den Socket aus dem Container schmeißt und die stop funktion aufruft.</p>
<p>Das Problem ist, das ich in dem Thread eine Blockierende Methode aufrufe (connection_manager_.stop(shared_from_this());) Das blockiert das Programm und nix geht mehr, was auch logish ist da in der stop - Funktion der Mutex noch garnicht freigegeben ist.</p>
<p>Hat jemand eine Idee wie ich das Problem lösen kann oder eine ist ein thread hier die flasche vorgehensweise? Wichtig ist der TTL muss Non-Blocking sein (ist ja klar)</p>
<p>Oder wie kann ich den Socket aus einem parallelen programmablauf runter fahren? Der thread muss as irgendwie automatisch machen ich kann keine blockierende &quot;while is thread running&quot; schleife einbauen da ich dann den kompletten Socket blockiere.</p>
<p>Dank für eure Hilfe</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259503/socket-sauber-runter-fahren-problem-mit-boost-thread-und-blocking-function</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 19:42:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259503.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Jan 2010 12:02:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Socket sauber runter fahren: Problem mit Boost, Thread und Blocking Function on Sun, 24 Jan 2010 12:02:17 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe einen TCP-Server der mehrere Sockets verwalten kann, da klappt alles super, nun habe ich ein TTL (Time To Live) eingebaut, der angibt, wie lange ein Socket unbenutzt leben darf. Klappt auch alles soweit ganz gut nur habe ich das Problem den Socket nach ablauf des TTL &quot;sauber&quot; runter zu fahren. Habe ehr den eindruck das ich den &quot;hart&quot; abstürzen lasse. Hier mal mein Code:</p>
<pre><code class="language-cpp">connection::~connection()
{
    log&amp; log_ = log::getInstance(server_settings_);
    log_.write(&quot;connection closed: &quot;+unique_id_, log::DEBUG);
}

void connection::handle_read(const boost::system::error_code&amp; error, std::size_t bytes_transferred)
{
    ttl_is_running_ = true;
    ttl_thread_.interrupt();
    ttl_thread_ = boost::thread(boost::bind(&amp;connection::run_ttl, shared_from_this()));
}
void connection::stop()
{
    log&amp; log_ = log::getInstance(server_settings_);
    log_.write(&quot;stop have been called: &quot;+unique_id_, log::DEBUG);
    ttl_is_running_ = false;
    boost::lock_guard&lt;boost::mutex&gt; lock(ttl_mutex_);
    ttl_break_condition_.notify_one();
    ttl_thread_.join();
    socket_.close();
}

void connection::run_ttl()
{
    boost::unique_lock&lt;boost::mutex&gt; lock(ttl_mutex_);
    log&amp; log_ = log::getInstance(server_settings_);
    try {
        do {
	    log_.write(&quot;ttl have been started: &quot;+unique_id_, log::DEBUG);
	    ttl_is_running_ = false;
	} while (!ttl_break_condition_.timed_wait(lock, boost::posix_time::seconds(15)) &amp;&amp; ttl_is_running_);
        log_.write(&quot;ttl have been expired: &quot;+unique_id_, log::DEBUG);
	connection_manager_.stop(shared_from_this());
    } catch (boost::thread_interrupted&amp;) {
        log_.write(&quot;ttl have been aborted: &quot;+unique_id_, log::DEBUG);
    }
}
</code></pre>
<p>run_ttl: &lt;-- ist die funktion des TTL die via Thread ausgeführt wird.<br />
stop: &lt;-- schließt den Socket<br />
connection_managet_: &lt;-- hält alle Sockets in einem Container</p>
<p>Die ist mal ein ausschnitt von einem Socket. Immer wenn man etwas an den Server schickt, wird der aktuelle boost::thread angehalten und neu gestared, damit bezwecke ich das der TTL von vorne beginnt. Dies passiert in der handle_read - Funktion</p>
<p>Wenn der TTL abgelaufen ist, soll der Socket geschlossen werden und saubet entfernt werden, das bedeutet das ich das über meinen Connection Manager macher da dieser den Socket aus dem Container schmeißt und die stop funktion aufruft.</p>
<p>Das Problem ist, das ich in dem Thread eine Blockierende Methode aufrufe (connection_manager_.stop(shared_from_this());) Das blockiert das Programm und nix geht mehr, was auch logish ist da in der stop - Funktion der Mutex noch garnicht freigegeben ist.</p>
<p>Hat jemand eine Idee wie ich das Problem lösen kann oder eine ist ein thread hier die flasche vorgehensweise? Wichtig ist der TTL muss Non-Blocking sein (ist ja klar)</p>
<p>Oder wie kann ich den Socket aus einem parallelen programmablauf runter fahren? Der thread muss as irgendwie automatisch machen ich kann keine blockierende &quot;while is thread running&quot; schleife einbauen da ich dann den kompletten Socket blockiere.</p>
<p>Dank für eure Hilfe</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843982</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Sun, 24 Jan 2010 12:02:17 GMT</pubDate></item></channel></rss>