C ++の読み取り/書き込みロック(stl、boost)
C Read Write Lock Stl
STLとBoostの両方が利用可能ですshared_mutex
「リーダーライター」問題を解決するためにshared_mutex
この名前はあまり適切ではなく、pthreadが「読み取り/書き込みロック」を呼び出すほど良くありません。
shared_mutex
平均よりmutex
より多くの機能lock_shared() / unlock_shared()
、複数の(リーダー)スレッドが同時にロックおよびロック解除できるようにするshared_lock
共有バージョンと同等lock_guard
。
正しいshared_mutex
使用lock_guard
またはunique_lock
それは作家の独占の目的を達成します。
class Counter { public: Counter() : value_(0) { } // Multiple threads/readers can read the counter's value at the same time. std::size_t Get() const { std::shared_lock lock(mutex_) return value_ } // Only one thread/writer can increment/write the counter's value. void Increase() { // You can also use lock_guard here. std::unique_lock lock(mutex_) value_++ } // Only one thread/writer can reset/write the counter's value. void Reset() { std::unique_lock lock(mutex_) value_ = 0 } private: mutable std::shared_mutex mutex_ std::size_t value_ }
スレッドが、最初はリーダーとしてshared_lock
ロックされていて、読んだ後に突然ライターになりたい場合は、どうすればよいですか?
方法1 :最初のインタプリタロックとライターロック。このアプローチの問題は、1つのソリューションと1つのプラスの間で、他のライターがデータに介入して変更した可能性があるため、現在のスレッドがリーダーとして保持している状態(ポインター、イテレーターなど)が無効になることです。
方法2 :use upgrade_lock
(ブーストのみ、STLでは使用できません)は、shared_lock
Useとして使用できますが、必要に応じて、リーダーからライターに直接「アップグレード」できます。
{ // Acquire shared ownership to read. boost::upgrade_lock upgrade_lock(shared_mutex_) // Read... // Upgrade to exclusive ownership to write. boost::upgrade_to_unique_lock unique_lock(upgrade_lock) // Write... }