リーダー/ライター ロックで保護する必要がある一連のデータ構造があります。私はboost::shared_lockを認識していますが、std::mutex、std::condition_variable、および/またはstd::atomicを使用してカスタム実装を行い、それがどのように機能するかをよりよく理解できるようにしたいと考えています(後で微調整します) .
各データ構造 (移動可能だがコピー可能ではない) は、ロックをカプセル化する Commons と呼ばれるクラスから継承されます。パブリック インターフェイスを次のようにしたいと思います。
class Commons {
public:
void read_lock();
bool try_read_lock();
void read_unlock();
void write_lock();
bool try_write_lock();
void write_unlock();
};
...一部の人が公に継承できるように:
class DataStructure : public Commons {};
私は科学的なコードを書いており、通常はデータ競合を回避できます。このロックは主に、おそらく後で行う間違いに対する保護手段です。したがって、私の優先順位は低い読み取りオーバーヘッドであるため、正しく実行されているプログラムをあまり妨げません。各スレッドは、おそらく独自の CPU コアで実行されます。
リーダー/ライター ロックを表示していただけますか (疑似コードは問題ありません)。私が今持っているのは、ライターの飢餓を防ぐバリアントであるはずです。これまでの私の主な問題は、読み取りが安全かどうかを確認して実際にリーダーカウントをインクリメントするまでの read_lock のギャップでした。その後、write_lock は待機することを認識しています。
void Commons::write_lock() {
write_mutex.lock();
reading_mode.store(false);
while(readers.load() > 0) {}
}
void Commons::try_read_lock() {
if(reading_mode.load()) {
//if another thread calls write_lock here, bad things can happen
++readers;
return true;
} else return false;
}
私はマルチスレッドに慣れていないので、本当に理解したいと思っています。よろしくお願いします。