Stl

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... }