に相当するC++11はありますかboost::shared_mutex
。または、C ++ 11でマルチリーダー/シングルライターの状況を処理する別のソリューションですか?
3 に答える
私は試みましたが、shared_mutex
C++11 に入ることができませんでした。これは、将来の標準として提案されています。提案はこちらです。
編集: C++14の改訂版 (N3659)が承認されました。
実装は次のとおりです。
シンプル... 1つもありません。リーダー/ライターロックの標準 C++ 実装はありません。
ただし、ここにはいくつかのオプションがあります。
- 独自のリーダー/ライター ロックを作成する必要があります。
- あなたが言及したように、 Win32、POSIX、Boostなどのプラットフォーム固有の実装を使用してください。
- まったく使用しないでください。C++ 11 に既に存在するミューテックスを使用してください。
1番目に進んで独自のものを実装するのは恐ろしい作業であり、正しく理解していないと競合状態でコードをなぞってしまう可能性があります。仕事を少し簡単にする参照実装があります。
プラットフォームに依存しないコードが必要な場合、またはリーダー/ライター ロックのような単純なもののために余分なライブラリをコードに含めたくない場合は、#2をウィンドウから放り出すことができます。
そして、#3には、ほとんどの人が気づいていないいくつかの注意点があります。リーダー/ライター ロックを使用するとパフォーマンスが低下することが多く、単純なミューテックスを使用した同等の実装よりもコードが理解しにくくなります。これは、リーダー/ライター ロックの実装の舞台裏で行わなければならない余分な簿記のためです。
私はあなたの選択肢を提示することしかできません.実際には、それぞれの費用と利点を比較検討し、どれが最も効果的かを選択するのはあなた次第です.
編集:
C++17 には、複数の同時リーダーを持つことの利点がそれ自体shared_mutex
のパフォーマンス コストを上回る状況のための型が追加されました。shared_mutex
いいえ、boost::shared_mutex
C++11 には同等の for はありません。
ただし、読み取り/書き込みロックは C++14 以降でサポートされています。
- C++14 が追加されました
std::shared_timed_mutex
- C++17 が追加されました
std::shared_mutex
違いは、std::shared_timed_mutex
追加のタイミング操作が追加されることです。これは、によって実装されるより単純な TimedMutex 概念の拡張であるSharedTimedMutex概念を実装しstd::shared_mutex
ます。
読み取り/書き込みミューテックスのロックを取得することは、通常の を取得するよりもコストがかかることに注意してくださいstd::mutex
。結果として、読み取り/書き込みミューテックスは、頻繁に短時間の読み取り操作を行う場合、パフォーマンスを向上させません。読み取り操作が頻繁でコストがかかるシナリオに適しています。Anthony Williams の投稿から引用するには:
リーダー スレッドであっても、shared_mutex をロックするコストは、プレーンな std::mutex をロックするコストよりも高くなります。これは機能の必要な部分です --- shared_mutex にはミューテックスより多くの可能な状態があり、コードはそれらを正しく処理する必要があります。このコストは、オブジェクトのサイズ (実装と私の POSIX 実装の両方に単純なミューテックスと条件変数の両方が含まれます) と、ロックおよびロック解除操作のパフォーマンスの両方に影響します。
また、shared_mutex は競合点であるため、スケーラブルではありません。shared_mutex をロックすると、読み取りロックの場合でも、必然的にミューテックスの状態が変更されます。したがって、shared_mutex 状態を保持するキャッシュ ラインは、ロックまたはロック解除操作を実行しているプロセッサに転送する必要があります。
頻繁に短い読み取り操作を実行するスレッドが多数ある場合、マルチプロセッサ システムではキャッシュ ピンポンが大量に発生し、システムのパフォーマンスに大きな影響を与える可能性があります。この場合、リーダーは本質的にシリアル化されるため、単純なミューテックスを使用するだけのより単純な設計を採用することもできます。
読み取りが頻繁でない場合は、競合がないため、同時読み取りについて心配する必要はありません。いずれにせよ、そのシナリオでは単純なミューテックスで十分です。
読み取り操作に時間がかかる場合、この競合の結果はあまり目立たなくなります。ただし、ロックを保持したまま時間のかかる操作を行うのはデザインの匂いです。
ほとんどの場合、shared_mutex に代わるより良い方法があると思います。これらは、コンテキストに応じて、単純なミューテックス、shared_ptr のアトミック サポート、慎重に構築された同時実行コンテナーの使用、またはその他のものである可能性があります。