2017-06-02 9 views
2

ここにシナリオがあります。ボブは作家であり、アリスは読者です。ボブは物事を書いて、アリスはそれらを読みます。規則は次のとおりです。想像上のロックメカニズム:ノンブロッキング書き込み、読み取り、無効化

1)ボブは、アリスが読み込み中であるかどうか(読み込みは書き込みをブロックしない)を書き込むことができます。

2)ボブが書き込みを行っているとき、アリスは読み出すことができません(書き込みは読み込みをブロックします)。

3)アリスが読書を終えると、ボブが読んで書いたかどうかを知ることができます(読み手は、読んだデータが正しくないかどうかを検出できます)。

2)と3)は本当に1つの結合されたルールですが、私は良い議論のために2つを挙げています。問題は1つのミューテックスと1つのカウンタ(バージョン番号)で解決できますが、わたしが知らないのは、よく知られているシナリオでよく使われる名前ですか?それについて何か研究がなされていますか?

+0

あなたはトランザクションについて話しているかもしれませんか? 1.データを収集する2.ミューテックスをロックする3.ストアする4.ロックを解除する – user5821508

+3

1)と2):アリスが読んでいて、ボブが書いてみたいと思ったらどうなりますか? 1)と2)はこのシナリオでは矛盾しているようです。 – bolov

+0

@ user5821508 Bobの場合、ロックフリーです。直接データを保存する。 – mzer0

答えて

3

私には分かりませんが、よく知られているシナリオは用語で指定されていますか?

はい、それはSeqlockと呼ばれる: https://en.wikipedia.org/wiki/Seqlock

がそれで誰スタディをいたり、私はちょうどホイールを作るのですか?

AFAIKには、さまざまな実装(Linuxカーネルなど)と論文があります。

+1

書き込みは(技術的に)読み取りをブロックしません。単に無効化するだけで、順序番号が使用されるため、読者は無効化されたデータを読んだかどうかを知ることができます。 C++では、この移植性を実現するために、アトミック、メモリの順序、おそらくメモリフェンスに少し気を配ります。特に、ライターは、ロックを取得して解放する前にシーケンス番号を更新します。必要なシーケンシングを保証するには、これらの操作をミューテックス以外の順序で行う必要があります。 単一値のアトミックは、よりシンプルな/より高速な/予測可能なオプションです。 – Persixty

関連する問題