<?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::shared_mutex problem]]></title><description><![CDATA[<p>Hallo zusammen, ich habe aktuell ein Problem mit einen boost::shared_mutex.<br />
Daher erstmal 1 Frage vorweg: Funktioniert der auch in verwendung mit posix threads? Das ganze hatte sich historisch so entwickelt. Ansonsten könnte ich die Klassen entsprechend auf boost::thread umstricken.</p>
<p>Aber nun zum problem, der Thread der auf den shared_mutex exklusiv zugreifen soll blockiert obwohl scheinbar nirgendwo anders zugriff erfolgt. Den exklusiven zugriff möchte ich so erwirken:</p>
<pre><code class="language-cpp">void CPlayerManager::setLoginLogout(bool val)
{
    if ( val ) 
    {
        //anmelden des exklusiven zugriffs
        reloadmutex.lock_upgrade();
        //bekommen des exklusiven zugriffs
        reloadmutex.unlock_upgrade_and_lock(); //&lt;--hier blockts
    }
    else
    {
        //exklusiver zugriff freigeben
        reloadmutex.unlock();
    }
}
</code></pre>
<p>In zwei anderen Threads brauche ich auf den Mutex nur lese zugriff das geschieht prinzipiell so</p>
<pre><code class="language-cpp">reloadmutex.lock_shared(); 
CPlayer * newPlayer = new CPlayer(Connection);
//release shared lock
reloadmutex.unlock_shared();
</code></pre>
<p>GDB meint das keiner der beiden Threads sich gerade in einen zustand befindet welche das lock_shared() oder ähnliches abfragen aber trotz allem Blockiert der Hauptthread. Irgendwie mache ich noch was falsch. Ggf hab ich das prinzip des shared_mutex auch nur falsch verstanden?</p>
<p>Hier noch der GDB Auszug über den zustand vom reloadmutex</p>
<pre><code>$2 = {state = {shared_count = 5, exclusive = false, upgrade = true, exclusive_waiting_blocked = false},
  state_change = {&lt;boost::noncopyable_::noncopyable&gt; = {&lt;No data fields&gt;}, m = {__data = {__lock = 0, __count = 0,
        __owner = 0, __kind = 0, __nusers = 1, {__spins = 0, __list = {__next = 0x0}}},
      __size = '\0' &lt;repeats 16 times&gt;, &quot;\001\000\000\000\000\000\000&quot;, __align = 0}}, shared_cond = {cond = {__data = {
        __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0,
        __broadcast_seq = 0}, __size = '\0' &lt;repeats 47 times&gt;, __align = 0}}, exclusive_cond = {cond = {__data = {
        __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0,
        __broadcast_seq = 0}, __size = '\0' &lt;repeats 47 times&gt;, __align = 0}}, upgrade_cond = {cond = {__data = {
        __lock = 0, __futex = 1, __total_seq = 1, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x83df988, __nwaiters = 2,
        __broadcast_seq = 0},
      __size = &quot;\000\000\000\000\001\000\000\000\001&quot;, '\0' &lt;repeats 23 times&gt;, &quot;\210ù=\b\002\000\000\000\000\000\000\000\000\000\000&quot;, __align = 4294967296}}}
</code></pre>
<p>hoffe mir kann jemand helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252471/boost-shared_mutex-problem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 11:27:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252471.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Oct 2009 10:01:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_mutex problem on Tue, 20 Oct 2009 10:01:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen, ich habe aktuell ein Problem mit einen boost::shared_mutex.<br />
Daher erstmal 1 Frage vorweg: Funktioniert der auch in verwendung mit posix threads? Das ganze hatte sich historisch so entwickelt. Ansonsten könnte ich die Klassen entsprechend auf boost::thread umstricken.</p>
<p>Aber nun zum problem, der Thread der auf den shared_mutex exklusiv zugreifen soll blockiert obwohl scheinbar nirgendwo anders zugriff erfolgt. Den exklusiven zugriff möchte ich so erwirken:</p>
<pre><code class="language-cpp">void CPlayerManager::setLoginLogout(bool val)
{
    if ( val ) 
    {
        //anmelden des exklusiven zugriffs
        reloadmutex.lock_upgrade();
        //bekommen des exklusiven zugriffs
        reloadmutex.unlock_upgrade_and_lock(); //&lt;--hier blockts
    }
    else
    {
        //exklusiver zugriff freigeben
        reloadmutex.unlock();
    }
}
</code></pre>
<p>In zwei anderen Threads brauche ich auf den Mutex nur lese zugriff das geschieht prinzipiell so</p>
<pre><code class="language-cpp">reloadmutex.lock_shared(); 
CPlayer * newPlayer = new CPlayer(Connection);
//release shared lock
reloadmutex.unlock_shared();
</code></pre>
<p>GDB meint das keiner der beiden Threads sich gerade in einen zustand befindet welche das lock_shared() oder ähnliches abfragen aber trotz allem Blockiert der Hauptthread. Irgendwie mache ich noch was falsch. Ggf hab ich das prinzip des shared_mutex auch nur falsch verstanden?</p>
<p>Hier noch der GDB Auszug über den zustand vom reloadmutex</p>
<pre><code>$2 = {state = {shared_count = 5, exclusive = false, upgrade = true, exclusive_waiting_blocked = false},
  state_change = {&lt;boost::noncopyable_::noncopyable&gt; = {&lt;No data fields&gt;}, m = {__data = {__lock = 0, __count = 0,
        __owner = 0, __kind = 0, __nusers = 1, {__spins = 0, __list = {__next = 0x0}}},
      __size = '\0' &lt;repeats 16 times&gt;, &quot;\001\000\000\000\000\000\000&quot;, __align = 0}}, shared_cond = {cond = {__data = {
        __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0,
        __broadcast_seq = 0}, __size = '\0' &lt;repeats 47 times&gt;, __align = 0}}, exclusive_cond = {cond = {__data = {
        __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0,
        __broadcast_seq = 0}, __size = '\0' &lt;repeats 47 times&gt;, __align = 0}}, upgrade_cond = {cond = {__data = {
        __lock = 0, __futex = 1, __total_seq = 1, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x83df988, __nwaiters = 2,
        __broadcast_seq = 0},
      __size = &quot;\000\000\000\000\001\000\000\000\001&quot;, '\0' &lt;repeats 23 times&gt;, &quot;\210ù=\b\002\000\000\000\000\000\000\000\000\000\000&quot;, __align = 4294967296}}}
</code></pre>
<p>hoffe mir kann jemand helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795219</guid><dc:creator><![CDATA[Fedaykin]]></dc:creator><pubDate>Tue, 20 Oct 2009 10:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_mutex problem on Tue, 20 Oct 2009 10:35:49 GMT]]></title><description><![CDATA[<p>Ok, das problem konnte dann doch auf einfache weise behoben werden (hoffe ich) das problem war ein try catch block in dem ein shared_lock eingebettet war, dieser hat den lock nicht freigegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795244</guid><dc:creator><![CDATA[Fedaykin]]></dc:creator><pubDate>Tue, 20 Oct 2009 10:35:49 GMT</pubDate></item></channel></rss>