<?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[try_lock und weitergeben]]></title><description><![CDATA[<p>(Ich verwende boost Synchronization und threads)</p>
<p>Ich möchte einen Verweis auf ein Objekt an einen Thread weitergeben und solange der Thread lebt gelockt lassen, sodass dies nicht an einen anderen Thread vergeben werden kann.</p>
<p>Das hier ist weit entfernt vom Funktionieren, doch es verdeutlich vielleicht meine Pläne etwas besser:</p>
<pre><code>struct DataChunk {
    // shared_array
    // ein mutex?
};

std::shared_ptr &lt;DataChunk&gt; KLASSE::grab() {
    // EDIT:
    boost::lock_guard &lt;boost::mutex&gt; (this-&gt;container_access_mutex);
    for (auto i = std::begin(DataChunks); i != std::end(DataChunks); ++i) {
        if (i-&gt;LOCK_MEMBER-&gt;try_lock()) {
            // return *i;
        }
    }
}

// In einem Thread:
{
    KLASS instanz; // wo auch immer die her kommt
    auto d = instanz.grab();
    boost::lock_guard &lt;/* ... */&gt; scoped_lock (d.LOCK_MEMBER);
}
</code></pre>
<p>EDIT: Das Problem ist die Threadsafety und der Zugriff auf den mutex von 2 verschiedenen Orten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320399/try_lock-und-weitergeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 03:41:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320399.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Sep 2013 19:32:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try_lock und weitergeben on Thu, 26 Sep 2013 19:40:08 GMT]]></title><description><![CDATA[<p>(Ich verwende boost Synchronization und threads)</p>
<p>Ich möchte einen Verweis auf ein Objekt an einen Thread weitergeben und solange der Thread lebt gelockt lassen, sodass dies nicht an einen anderen Thread vergeben werden kann.</p>
<p>Das hier ist weit entfernt vom Funktionieren, doch es verdeutlich vielleicht meine Pläne etwas besser:</p>
<pre><code>struct DataChunk {
    // shared_array
    // ein mutex?
};

std::shared_ptr &lt;DataChunk&gt; KLASSE::grab() {
    // EDIT:
    boost::lock_guard &lt;boost::mutex&gt; (this-&gt;container_access_mutex);
    for (auto i = std::begin(DataChunks); i != std::end(DataChunks); ++i) {
        if (i-&gt;LOCK_MEMBER-&gt;try_lock()) {
            // return *i;
        }
    }
}

// In einem Thread:
{
    KLASS instanz; // wo auch immer die her kommt
    auto d = instanz.grab();
    boost::lock_guard &lt;/* ... */&gt; scoped_lock (d.LOCK_MEMBER);
}
</code></pre>
<p>EDIT: Das Problem ist die Threadsafety und der Zugriff auf den mutex von 2 verschiedenen Orten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355862</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 26 Sep 2013 19:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Thu, 26 Sep 2013 19:46:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Zugriff auf den mutex von 2 verschiedenen Orten.</p>
</blockquote>
<p>Was soll daran ein Problem sein? Mutexe selbst sind ein <code>atomic_bool</code> mit drumherum. Die sind völlig Threadsafe, sonst würde ja rein gar nichts funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355866</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 26 Sep 2013 19:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Thu, 26 Sep 2013 23:50:17 GMT]]></title><description><![CDATA[<p>Hmmm.<br />
Dann mal konkreter:</p>
<p>- Wie würdest du / würdet ihr den Mutex weitergeben. (irgendein wrapper wie shared_ptr um den mutex?)<br />
- Kann man sie versehentlich kopieren?<br />
- wenn ich ein lock_guard verwende mit dem bereits gelockten mutex, wie erzeuge ich den guard (defer_lock)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355867</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 26 Sep 2013 23:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 00:21:35 GMT]]></title><description><![CDATA[<p>@Tim06TR<br />
Beschreib mal bitte etwas genauer was du machen möchtest. Ist mir nämlich nicht so ganz klar.<br />
Und schreib auch dazu ob dein Compiler C++11 kann.</p>
<p>Ansonsten... falls das relevant sein sollte: ne Mutex darfst du nur aus dem Thread wieder freigeben der sie auch gelockt hat. Wenn du in einem Thread locken willst, dann an einen anderen übergeben und dort dann später unlocken, dann musst du nen binären Semaphor statt ner Mutex nehmen. Bei nem Semaphor ist das nämlich erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355896</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 27 Sep 2013 00:21:35 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 01:51:32 GMT]]></title><description><![CDATA[<p>ja C++11 ist alles super, bis auf threads (mingw - gcc 4.8.1)</p>
<p>---------------------------------------------------------------------------------------<br />
Zunächst: Ich habe meine Frage falsch und schlecht gestellt.<br />
---------------------------------------------------------------------------------------</p>
<p>Ich habe mir einen Puffer erdacht, in den ich gleichzeitig lesen und schreiben kann mit mindestens einem Lesethread und mindestens einem Schreibthread.<br />
Der Puffer besteht aus einer Queue mit shared_array Instanzen (=&quot;chunk&quot;).<br />
Durch &quot;grab_w&quot; wird ein Chunk erstellt (bis zu einem maximum) und gibt ihn zurück, damit er mit Daten gefüllt werden kann.<br />
Die Funktion &quot;grab_r&quot; gibt ein Chunk zurück, der nicht mehr außerhalb verwendet wird (von einem grab_w aufruf) (in richtiger Reihenfolge, daher queue).<br />
Außerdem wird er aus der queue entfernt.</p>
<p>Ich scheitere gerade an dem wrapper, der ein chunk enthält und automatisch die Klass &quot;DataFeed&quot; mitteilt, dass er nicht mehr verwendet / noch verwendet wird.</p>
<p>Schematische Benutzung von &quot;DataFeed&quot;:</p>
<p>Hier mal schnell im Forum geschrieben:</p>
<pre><code>// Beispielhaftes Interface für die Klasse darunter:
class DataFeed {
public:
    class DataChunk {
        // ???
    };
private:
    uint32_t max_queue_size_;
    uint32_t chunk_size_;
    std::queue &lt;/* ??? */&gt; queue_;

    void wait_r_avail() const; // verwendet vielleicht std::conditional_variable
    void wait_w_avail() const; // blockiert solange queue_.size() == max_queue_size_

    DataChunk grab_w(); // impl ?
    DataChunk grab_r(); // impl ?
};

// ok der Klassenname ist jetzt doof, aber ich editiere ihn nicht, falls schon jemand angefangen hat den zu zitieren.
class asnyc_rw {
private:
    thread reader_;
    thread writer_;
    DataFeed buffer_;
    std::atomic_long_long remaining_; // remaining data
    uint32_t chunk_size_; // im ctor erhalten und an DataFeed weitergereicht

private:
    void read();
    void write();

public:
    void transfer();

    // mehr (ctor, dtor, ...)
};
//-------------------------------------------------------------------------------------------------------------------
void async_rw::transfer() {
    reader_ = thread(std::bind(&amp;async_rw::read, this));

    write(); // evtl später in thread &quot;writer_&quot;
}
//-------------------------------------------------------------------------------------------------------------------
void async_rw::read() {
    std::ifstream file (&quot;somewhere&quot;, std::ios_base::binary);
    do {    
        buffer_.wait_w_avail(); // blockiert solange die queue ihre maximale Größe hat. Sollte zu Beginn niemals blockieren
        auto chunk = buffer_.grab_w(); // hat chunk_size_ größe
        file.read(chunk.get(), chunk_size_); // oder ähnlich
    } while (file.gcount());

    // lese daten von festplatte oder sonstwo her und speicher sie in chunk

    // chunk läuft out of scope und wird damit verfügbar durch die Funktion &quot;buffer_.grab_r&quot;
    // Die blockierende Funktion &quot;buffer_.wait_r_avail()&quot; lässt nun ein Mal durch (zB. std::conditional_variable::notify_one()) und ist danach wieder blockierend
}
//-------------------------------------------------------------------------------------------------------------------
void async_rw::write() {
    while (remaining_.load()) {
        buffer_.wail_r_avail();        // verwendet vielleicht std::conditional_variable
        auto chunk = buffer_.grab_r(); // soll wenn obige Funktion fälschlicherweise nicht verwendet wird geworfen

        // verschicke &quot;chunk&quot; mit socket
    }
}
//-------------------------------------------------------------------------------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2355897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355897</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 27 Sep 2013 01:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 02:22:40 GMT]]></title><description><![CDATA[<p>Mir scheint, Du brauchst nur eine Semaphore zu benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355900</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 27 Sep 2013 02:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 02:44:30 GMT]]></title><description><![CDATA[<p>Mal am Rande: Bei einem Test:</p>
<pre><code>std::atomic_bool b;
b.store(true);

std::shared_ptr &lt;std::atomic_bool&gt; spb;
spb-&gt;store(true); // BOOOOOMMMM (SIGSEV in &quot;void store(/* ... */) noexcept&quot;
</code></pre>
<p>wie gesagt GCC 4.8.1 (mingw)</p>
<p>Was habe ich hier verletzt?</p>
<p>EDIT: haha shred_ptr :D... hammer Tippfehler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355902</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 27 Sep 2013 02:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 02:45:38 GMT]]></title><description><![CDATA[<p>Tim06TR schrieb:</p>
<blockquote>
<p>Was habe ich hier verletzt?</p>
</blockquote>
<p>Dein Pointer zeigt auf kein Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355903</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 27 Sep 2013 02:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 03:04:23 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Tim06TR schrieb:</p>
<blockquote>
<p>Was habe ich hier verletzt?</p>
</blockquote>
<p>Dein Pointer zeigt auf kein Objekt.</p>
</blockquote>
<p>uuuoooopppsss</p>
<p>ok ich geh schlafen <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="😃"
    /> *derp*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355904</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 27 Sep 2013 03:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 06:21:32 GMT]]></title><description><![CDATA[<p>Ok, habe das ganze nun hinbekommen, genauso wie ich es wollte. Ich bin mir aber sicher, dass man es noch sauberer hätte machen können.<br />
Ich verwende 2 shared_ptr mit atomics, 1 conditional_variable (n), einen shared_ptr mit einem mutex, sowie einen Instanzenzähler. Alles pro Chunk.</p>
<p>EDIT: Ich habe nicht die Zeit von vorhin bis jetzt gebraucht, ich habe noch eine andere Codestelle umgebaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355912</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 27 Sep 2013 06:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 09:04:49 GMT]]></title><description><![CDATA[<p>Lies <a href="http://de.wikipedia.org/wiki/Erzeuger-Verbraucher-Problem" rel="nofollow">http://de.wikipedia.org/wiki/Erzeuger-Verbraucher-Problem</a> und schau, ob es besser passen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355927</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 27 Sep 2013 09:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 17:37:52 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Zugriff auf den mutex von 2 verschiedenen Orten.</p>
</blockquote>
<p>Was soll daran ein Problem sein? Mutexe selbst sind ein <code>atomic_bool</code> mit drumherum. Die sind völlig Threadsafe, sonst würde ja rein gar nichts funktionieren.</p>
</blockquote>
<p>Das klingt fast wie:</p>
<p>Ein Betriebssystem ist ein</p>
<pre><code>void main() { }
</code></pre>
<p>mit drumherum. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2356056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356056</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 27 Sep 2013 17:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to try_lock und weitergeben on Fri, 27 Sep 2013 17:42:01 GMT]]></title><description><![CDATA[<p>Natürlich implementiert ein Mutex sehr viel nützliches Verhalten. Der Kernpunkt ist aber, dass die einzigen Member von <code>mutex</code> atomar sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356059</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 27 Sep 2013 17:42:01 GMT</pubDate></item></channel></rss>