2015-09-11 8 views
5

私は、あるスレッドが別のスレッドより多くの仕事をしているときに飢えに苦しむプログラムに取り組んでいます。クリティカルセクションは、リエントラントQMutexによって保護されていますが、これは公正ではありません。Fair Reentrant Lock C++

Javaでは、ロックのフェアネスパラメータを指定できます。 C++(またはブーストライブラリ)は、公正なリエントラントロックを利用できますか?好ましくはC++まで11。

以前はいくつかの研究を行っていましたが、boostにshared_lockがありますが、読み書きロックは必要ありません。それぞれのスレッドがクリティカルセクションに入る機会が等しいことを保証するロックだけです。

はどうもありがとうございました。

+1

'STDと'のstd :: mutex' :: lock_guardがあります 'C++ 11が、それらが公正であることを保証していないからです。私は、MSVC CRTの実装では待ち行列を使用していると思います。 – Cameron

+0

はい..しかし、私は公正なロックが必要です... – Veaceslav

+0

一般にC++では利用できない公平パラメータを使用するのではなく、作業ディスパッチを優先的にキューイングして状況を詳細に制御できることがあります飢餓を避けるために「重い」操作を抑制する。それは明らかにより多くのコーディングですが、長期的にはよりよい結果をもたらすかもしれません。 –

答えて

2

C++スレッドプリミティブは実際にはPosixスレッドに基づいており、Posixには公正なミューテックスはありません。しかし、あなたの質問は、あなたのデザインに問題があることを示しています。 2つの問題がここにあります

  1. リエントラントミューテックスは、問題の兆候です。ミューテックスの所有権とライフサイクルを100%コントロールする必要があります。あなたがリエントラントミューテックスを必要とするならば、それは意味があります、デザインはお粗末です。
  2. 説明のスレッドの不足は、不適切に設計されたスレッド通信の結果です。スレッドが作業期間中保持されているミューテックスを必要とする場合は、シングルスレッドシステムを効果的に設計しており、スレッドがまったく必要ないことを意味します。
+0

ええ、原理的には、しかし、しばしば物事はそれほど単純ではありません;-) – Cameron

+0

@Cameron、原則ではありません。実生活では。 – SergeyA

+0

リエントラントについては正しいかもしれませんが、公平性とスレッドの飢餓について正しくはありません。スレッドは簡単なシナリオでも飢えてしまうことがあります。問題が広範囲に議論されていた同時実行のコースをやりましたが、現実には問題に直面しました。 C++は、マルチスレッドプログラムを開発する際に本当に必要不可欠なものを貧弱にサポートしています。 – Veaceslav

関連する問題