<?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[std::mutex mit Priorität?]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der Standard library (oder evtl. in boost) eine Möglichkeit einen Mutex mit einer bestimmten Priorität zu locken, also so dass ein thread mit hoher Priorität immer beim warten Vorrang hat?</p>
<p>Hab bei Google eine <a href="http://stackoverflow.com/questions/11666610/how-to-give-priority-to-privileged-thread-in-mutex-locking" rel="nofollow">Lösung</a> gefunden die 3 verschiedene Mutex verwendet, ist das eine gute Lösung (vor allem auch eine die 100% sicher ist)? Ich frag auch weil die Antwort da schon über 3 Jahre alt ist, gibt es da was &quot;besseres&quot; oder ist das der empfohlene Weg?</p>
<p>Am liebsten wäre mir etwas wie <code>my_mutex.lock(priority::HIGH)</code> oder so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333717/std-mutex-mit-priorität</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 18:29:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333717.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Jul 2015 08:37:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 08:37:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der Standard library (oder evtl. in boost) eine Möglichkeit einen Mutex mit einer bestimmten Priorität zu locken, also so dass ein thread mit hoher Priorität immer beim warten Vorrang hat?</p>
<p>Hab bei Google eine <a href="http://stackoverflow.com/questions/11666610/how-to-give-priority-to-privileged-thread-in-mutex-locking" rel="nofollow">Lösung</a> gefunden die 3 verschiedene Mutex verwendet, ist das eine gute Lösung (vor allem auch eine die 100% sicher ist)? Ich frag auch weil die Antwort da schon über 3 Jahre alt ist, gibt es da was &quot;besseres&quot; oder ist das der empfohlene Weg?</p>
<p>Am liebsten wäre mir etwas wie <code>my_mutex.lock(priority::HIGH)</code> oder so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461109</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 27 Jul 2015 08:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 09:51:54 GMT]]></title><description><![CDATA[<p>Wie du selber rausgefunden hast, ist das nicht so einfach. Daher die obligatorische Frage: Was brauchst du? Insbesondere wie viele Prioritätslevel, ob stufenlos (double), einige wenige (&lt;10) oder nur 3 oder 2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461115</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 09:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 10:07:54 GMT]]></title><description><![CDATA[<p>Ich brauche eigentlich nur 2 Level: LOW und HIGH. Wobei es immer nur einen HIGH thread geben wird und wenige LOW (aktuell einen, später eventuell 2 bis 3). Von denen ist die Priorität dann aber egal, nur mein einer HIGH thread soll Vorrang haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461118</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 27 Jul 2015 10:07:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 12:13:42 GMT]]></title><description><![CDATA[<p>Bei nur 2 Threads insgesamt reicht ein einfacher Mutex.<br />
Ab 3 Low-priority-Threads würde ich die verlinkte 3-Thread-Lösung nehmen. Die funktioniert (spiel halt mal alle Fälle durch) und benötigt garantiert konstante Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461139</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 12:13:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 12:14:35 GMT]]></title><description><![CDATA[<p>*3-Mutex-Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461140</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 12:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 12:28:07 GMT]]></title><description><![CDATA[<p>Eine allgemeine Lösung kann mittels einer <code>priority_queue</code> geschrieben werden. Statt <code>vector</code> sollte man <code>boost::container::static_vector</code> als den von <code>queue</code> verwendeten Container festlegen, falls möglich.</p>
<p>Ein grobes Beispiel:</p>
<pre><code>class priority_mutex : std::mutex
{
	std::priority_queue&lt;std::size_t&gt; queue;
	std::mutex qmutex;

public:

	using std::mutex::native_handle_type;
	using std::mutex::native_handle;
	using std::mutex::unlock;
	using std::mutex::try_lock;

	void lock(std::size_t p) {
		if (!try_lock())
		{
			qmutex.lock();
			queue.push(p);
			qmutex.unlock();

			while (queue.top() != p || !try_lock())
				std::this_thread::sleep_for(std::chrono::milliseconds(5));

			qmutex.lock();
			queue.pop();
			qmutex.unlock();
		}
	}
};
</code></pre>
<p>Demo gibt's <a href="http://coliru.stacked-crooked.com/a/a3087355a75e3b82" rel="nofollow"><strong>hier</strong></a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461142</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 27 Jul 2015 12:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 12:41:32 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>while (queue.top() != p || !try_lock())
                std::this_thread::sleep_for(std::chrono::milliseconds(5));
</code></pre>
</blockquote>
<p>Bitte kein Busy-Waiting. Davon abgesehen skaliert es nicht. Das ist ein gutes Beispiel, wie man es <em>nicht</em> machen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461144</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 12:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 12:44:01 GMT]]></title><description><![CDATA[<p>Hast du einen besseren Vorschlag?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461145</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Mon, 27 Jul 2015 12:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 13:02:34 GMT]]></title><description><![CDATA[<p>logga schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>while (queue.top() != p || !try_lock())
                std::this_thread::sleep_for(std::chrono::milliseconds(5));
</code></pre>
</blockquote>
<p>Bitte kein Busy-Waiting. Davon abgesehen skaliert es nicht. Das ist ein gutes Beispiel, wie man es <em>nicht</em> machen sollte.</p>
</blockquote>
<p>Jo, ist mir auch klar geworden. Ich schreibs um.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461149</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 27 Jul 2015 13:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 13:20:18 GMT]]></title><description><![CDATA[<p><a href="http://coliru.stacked-crooked.com/a/c411e9383fb12e8d" rel="nofollow">Mein Vorschlag</a>:</p>
<pre><code class="language-cpp">class two_priority_mutex {
  std::mutex low_priority_mutex, next_access_mutex, data_mutex;
public:
  void lock() {
    std::unique_lock&lt;std::mutex&gt; low(low_priority_mutex);
    std::lock_guard&lt;std::mutex&gt; guard(next_access_mutex);
    data_mutex.lock();
    low.release();
  }
  void unlock() noexcept {
    data_mutex.unlock();
    low_priority_mutex.unlock();
  }
  void high_priority_lock() {
      std::lock_guard&lt;std::mutex&gt; guard(next_access_mutex);
      data_mutex.lock();
  }
  void high_priority_unlock() noexcept {
      data_mutex.unlock();
  }
  class high {
    two_priority_mutex *me;
  public:
    high(two_priority_mutex *me) : me(me) {}
    void lock() { me-&gt;high_priority_lock(); }
    void unlock() noexcept { me-&gt;high_priority_unlock(); }
  };
  high high_priority_locker() {
    return high(this);
  }
};

two_priority_mutex m;

// High-Priority-Thread
{
  auto h = m.high_priority_locker();
  std::lock_guard&lt;two_priority_mutex::high&gt; g(h);
  ...
}

// Low-Priority-Threads
{
  std::lock_guard&lt;two_priority_mutex&gt; g(m);
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2461151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461151</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 13:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 13:24:51 GMT]]></title><description><![CDATA[<p>Ich hab es mit einer cv umgeschrieben:</p>
<pre><code>class priority_mutex : std::mutex
{
	std::priority_queue&lt;std::size_t&gt; queue;
	std::mutex qmutex;
	std::condition_variable cv;

public:

	using std::mutex::native_handle_type;
	using std::mutex::native_handle;
	using std::mutex::try_lock;

	void lock(std::size_t p) {
		if (!try_lock())
		{
			std::unique_lock&lt;std::mutex&gt; ulock(qmutex);
			queue.push(p);

			cv.wait(ulock, [this, p] {return queue.top() == p &amp;&amp; try_lock();});

			queue.pop();
			qmutex.unlock();
			cv.notify_all();
		}
	}

	void unlock() {
		std::mutex::unlock();
		cv.notify_all();
	}
};
</code></pre>
<p><a href="http://coliru.stacked-crooked.com/a/8cda5191d3f3aa0f" rel="nofollow"><strong>Demo</strong></a>. Kann aber natürlich wieder Unsinn sein <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/2461152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461152</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 27 Jul 2015 13:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 13:42:49 GMT]]></title><description><![CDATA[<p>Wow, vielen Dank auf jeden Fall euch beiden, werde ich mir gleich mal genauer anschauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461159</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 27 Jul 2015 13:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 17:02:16 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ich hab es mit einer cv umgeschrieben:</p>
</blockquote>
<p>Auf den ersten Blick finde ich das eine schicke Lösung <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="😃"
    /><br />
Allerdings behagt mir dieser Prioritäts-Mutex trotzdem irgendwie nicht so ganz:<br />
Ich will nicht ausschließen, dass er irgendwo mal Sinn macht, aber mein Bauchgefühl sagt mir, dass die Prioritätswarteschlange überhaupt erst dann ihre<br />
Wirkung entfaltet, wenn man eigentlich ein anderes Problem hat: Zu viel Contention auf der Ressource, die von dem Mutex geschützt wird.</p>
<p>Das mag jetzt eine Binsenweisheit sein, und das Problem ist oft nicht einfach zu lösen.<br />
Eine Technink als Anregung: bei keineren bis mittelgroßen Objekten mit viel Contention hat sich bei mir des öfteren z.B. ein COW-Ansatz bewährt.<br />
Trotz der zusätzlichen Kopie hat sich dabei nicht selten der Gesamtdurchsatz deutlich erhöht, da sich die Threads wesentlich weniger auf gegenseitig auf den Füßen stehen:</p>
<pre><code>auto shared = std::make_shared&lt;const Resource&gt;();

thread1:
    auto res = std::atomic_load(&amp;shared);
    res-&gt;readOnly();

thread2:
    auto res = std::atomic_load(&amp;shared);
    auto mut = std::make_shared&lt;Resource&gt;(*res));
    mut-&gt;mutate();
    std::atomic_store(&amp;shared, std::static_pointer_cast&lt;const Resource&gt;(mut));
</code></pre>
<p>Das ist natürlich nur eine mögliche Variante, wie man auf den Mutex verzichten kann, und sie ist natürlich nicht immer sinnvoll.<br />
Gut möglich dass der Prioritäts-Mutex schon eine der besseren Lösungen für dein spezielles Problem ist.</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461163</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Mon, 27 Jul 2015 17:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 15:29:57 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><a href="http://coliru.stacked-crooked.com/a/8cda5191d3f3aa0f" rel="nofollow"><strong>Demo</strong></a>. Kann aber natürlich wieder Unsinn sein <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>
</blockquote>
<p>Mein Hauptkritikpunkt ist immer noch da. Wenn du 1000 Threads am Warten hast, musst du jedesmal immer alle aufwecken. Bei n Locks hat jeder Thread O(n) Overhead, total macht das O(n<sup>2</sup>) Laufzeit.</p>
<p><a href="http://coliru.stacked-crooked.com/a/3412c642555a5dc2" rel="nofollow">Hier meine Umsetzung</a> mit O(1) Overhead und O(n log n) Laufzeit (optimal, da die Priority-Queue so lange braucht):</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class priority_mutex : std::mutex {
  struct entry {
    entry(T value, std::condition_variable *cv) : value(std::move(value)), cv(cv) {}
    T value;
    std::condition_variable *cv;
    friend bool operator&lt;(entry const&amp; a, entry const&amp; b) { return a.value &lt; b.value; }
  };
  std::priority_queue&lt;entry&gt; queue;
  std::mutex queue_mutex;
  std::mutex work_mutex;

public: 
  void lock(T p) {
    std::unique_lock&lt;std::mutex&gt; guard(queue_mutex);
    std::condition_variable cv;
    queue.emplace(p, &amp;cv);
    std::unique_lock&lt;std::mutex&gt; worker(work_mutex, std::defer_lock);
    cv.wait(guard, [&amp;]{ return p == queue.top().value &amp;&amp; worker.try_lock(); });
    queue.pop();
    worker.release();
  }
  void unlock() noexcept {
    work_mutex.unlock();
    std::lock_guard&lt;std::mutex&gt; guard(queue_mutex);
    if (!queue.empty())
      queue.top().cv-&gt;notify_one();
  }
};
</code></pre>
<p>Der am höchsten prioritäre Thread wird gezielt aufgeweckt. Es kann zwar passieren, dass zwischen unlock() und dem Aufwecken der condition variable ein neues Top-Element eingefügt wird, aber das startet dann sofort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461174</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 15:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 16:15:23 GMT]]></title><description><![CDATA[<p>@logga<br />
Deine Lösung hat dafür einen relativ grossen fixen Overhead, nämlich das Erzeugen + Löschen der lokalen <code>condition_variable</code> .<br />
(Wie gross der Overhead wirklich ist hängt natürlich von der Implementierung der Standard-Library ab, aber ich gehe davon aus dass es Implementierungen gibt wo der Overhead einigermassen gross ist.)</p>
<p>Ist im Prinzip das selbe Problem das man auch hat wenn man versucht <code>condition_variable</code> mit nur Win32 API zu implementieren (mit Windows XP, bzw. halt mit Windows Versionen die noch keine &quot;native&quot; Condition-Variablen haben). Da braucht man statt der per-Thread <code>condition_variable</code> einen per-Thread EVENT. Wenn man den ständig neu erzeugt und wieder freigibt ist das auch ziemlich langsam.</p>
<p>Lösung: ein thread-static EVENT der erzeugt wird wenn er das erste mal gebraucht wird, und erst freigegeben wenn der Thread terminiert.<br />
Analog könnte man hier eine thread-static <code>condition_variable</code> verwenden.<br />
(Genaugenommen würde auch hier ein thread-static EVENT reichen, nur das ist dann natürlich wieder nicht plattformübergreifend.)</p>
<p>Bzw. wenn man wirklich nur wenige Prioritätsklassen braucht, und innerhalb der Prioritätsklassen kein FIFO Verhalten, dann sollte es auch mit einer <code>condition_variable</code> pro Prioritätsklasse gehen. Dann muss man sich nicht mit thread-static rumschlagen.</p>
<p>ps: Wozu die <code>work_mutex</code> in deinem Code gut ist verstehe ich auch nicht ganz. Eine einzige Mutex die die Queue schützt ist vollkommen ausreichend:<br />
<code>return p == queue.top().value &amp;&amp; worker.try_lock();</code><br />
=&gt;<br />
<code>return queue.top().cv == &amp;cv</code><br />
EDIT: OK, nein, so einfach ist es dann doch nicht. Weil eben ein zweites <code>lock()</code> zwischen <code>unlock()</code> und dem Re-lock der internen Mutex im <code>wait()</code> reinfahren kann. /EDIT</p>
<p>ps2: Wenn man davon ausgeht dass es spurious Wakeups geben kann, dann ist dein Code sogar falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Weil er nicht prüft ob der aktuelle Thread wirklich <code>top</code> ist. Wenn ein Thread mit der selben Priorität wie der top Thread fälschlicherweise gleichzeitig mit dem top Thread aufgeweckt wird, dann könnte der falsche Thread bei <code>try_lock()</code> Erfolg haben. Danach wäre dann ein Eintrag mit einem Zeiger auf eine bereits zerstörte CV in der Queue, und beim nächsten <code>unlock</code> würde es knallen.</p>
<p>Und wenn man davon ausgeht dass es keine spurious Wakeups geben kann, dann ist die ganze Bedingung im <code>wait</code> überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461185</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 27 Jul 2015 16:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 16:50:55 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@logga<br />
Deine Lösung hat dafür einen relativ grossen fixen Overhead, nämlich das Erzeugen + Löschen der lokalen <code>condition_variable</code> .<br />
(Wie gross der Overhead wirklich ist hängt natürlich von der Implementierung der Standard-Library ab, aber ich gehe davon aus dass es Implementierungen gibt wo der Overhead einigermassen gross ist.)</p>
</blockquote>
<p>Dass es einen riesigen Overhead hat, ist mir klar. Man muss sich halt entscheiden zwischen dem algorithmisch suboptimalen Code von Arcoth oder meinem mit einer grossen Konstante. Was für den jeweiligen Einsatzzweck besser ist, muss man selber rausfinden.</p>
<p>C++11 gibt einem halt wenig Mittel um so etwas performant zu implementieren. Deine Idee mit der per-Thread <code>condition_variable</code> macht es etwas besser und mit plattformabhängigen Konstrukten kriegt man das noch besser hin. Das war aber nicht mein Ziel.</p>
<blockquote>
<p>ps2: Wenn man davon ausgeht dass es spurious Wakeups geben kann, dann ist dein Code sogar falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Weil er nicht prüft ob der aktuelle Thread wirklich <code>top</code> ist. Wenn ein Thread mit der selben Priorität wie der top Thread fälschlicherweise gleichzeitig mit dem top Thread aufgeweckt wird, dann könnte der falsche Thread bei <code>try_lock()</code> Erfolg haben. Danach wäre dann ein Eintrag mit einem Zeiger auf eine bereits zerstörte CV in der Queue, und beim nächsten <code>unlock</code> würde es knallen.</p>
</blockquote>
<p>Ja, der Vergleich auf top sollte ein Vergleich auf <code>&amp;cv</code> sein. Der Code ist sogar ohne spurious Wakeups falsch:<br />
lock(2), lock(1a), unlock(2) wird vor dem notify unterbrochen, lock(1b) (poppt fälschlicherweise 1a weil 1a==1b), notify von unlock(2) =&gt; Zugriff auf das nicht mehr vorhandene cv von 1b!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461195</guid><dc:creator><![CDATA[logga]]></dc:creator><pubDate>Mon, 27 Jul 2015 16:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::mutex mit Priorität? on Mon, 27 Jul 2015 18:18:59 GMT]]></title><description><![CDATA[<p>Ich fände als Erweiterung der Standard Library praktisch: ein Teil das sich wie eine Condition-Variable verhält, allerdings gebunden an einen Thread (=also dass immer nur der &quot;Besitzer-Thread&quot; darauf warten kann - demendsprechend gibt es dann auch kein <code>notify_all</code> ).<br />
Und jeder Thread sollte so ein Ding dann per Default haben (bzw. darf es auch gerne beim 1. Aufruf der Accessor-Funktion erzeugt werden).<br />
Weiters sollte dieses Ding einen &quot;head&quot; für eine intrusive double linked list haben. (EDIT: OK, das wäre nicht wirklich nötig, die drei Zeiger könnte man auch genau so gut vom Stack nehmen, und die eine zusätzliche Indirektion die man dadurch bekommt kann man vermutlich verkraften. /EDIT)</p>
<p>So ein Ding liesse sich einerseits verwenden um damit diverse Standard-Library Klassen zu implementieren (z.B. <code>std::condition_variable</code> auf Plattformen wo es keine native CVs gibt). Und andrerseits natürlich auch um eigene synchronization primitives zu implementieren wie die hier diskutierte <code>priority_mutex</code> .<br />
Eine einfache Mutex mit FIFO Garantie wäre damit z.B. auch in ein paar wenigen Zeilen <em>relativ</em> performant implementierbar.</p>
<p>Bzw. würde damit überall dort wo man mit dieser eingeschränkten Variante auskommt der u.U. deutlich höhere Overhead einer <code>std::condition_variable</code> entfallen.</p>
<p>Ich habe vor vielen Jahren mal angefangen eine eigene Threading-Library zu implementieren (ist dann natürlich nie fertig geworden :D). Dort war genau so ein Ding enthalten, eben weil ich es für die Implementierung der CV benötigt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461217</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 27 Jul 2015 18:18:59 GMT</pubDate></item></channel></rss>