データ構造の同期のコンテキストで、誰かが「ロックレス」と「ノンブロッキング」の違いを明確にできますか? これらの用語は、多くの人が同じ意味で使用しているように見えますが、どこかに隠されている微妙な違いがないかどうかはまだわかりません.
つまり、ロックレスは「ロックなし」であり、ノンブロッキングは進行を保証するようなものです。一方が他方を暗示していると思われますが、その逆ではありません。よくわかりません。
参照歓迎。
データ構造の同期のコンテキストで、誰かが「ロックレス」と「ノンブロッキング」の違いを明確にできますか? これらの用語は、多くの人が同じ意味で使用しているように見えますが、どこかに隠されている微妙な違いがないかどうかはまだわかりません.
つまり、ロックレスは「ロックなし」であり、ノンブロッキングは進行を保証するようなものです。一方が他方を暗示していると思われますが、その逆ではありません。よくわかりません。
参照歓迎。
ロックはアクセス制御メカニズムです。これにより、リソースへの排他的アクセスが必要なときにリソースをロックすることを意味します。ドアをロックし、部屋を使用する/好きなことをして、他の人のために部屋のロックを解除して、すぐに使用できるようにします。部屋が施錠されている間は、誰も部屋に入ることができず、何もできませんでした。
ブロッキングは、データがない限り戻ってこない保証されたデータ取得のために使用されます。ドア/パイプ/ソケット(基本的には何でも)で待ち続け、データが利用可能になったらそれを取得して戻ってきます。
追加
- 単語の文字通りの英語の意味に混乱しないでください。どちらも、それらを入れようとするコンテキストで交換可能に使用できるためです。たとえば、ロックは、他の人が同じものを使用するのをブロックするようなものです。リソース、およびブロッキングは、データが利用可能になるまでリソースに自分自身を ロックすることができます(関数の呼び出し)。
したがって、LOCKING とは、指定された時間だけリソースをキャプチャすることを意味します (ブロックを解除しない限り)。また、BLOCKING はあなたがブロックされていることを意味します。つまり、データがないため先に進むことができず、先に進むことも先に進むこともできません。
プロセスの状態を変更し、割り込みまたはイベントが発生するのを待つことによって、それらが実装される方法。
それらはまったく異なります。
ロックとは、ロックを使用してファイル アクセスを制御する何らかの方法を使用することを意味します。これにより、2 つのプロセスが同じファイルに同時に書き込むのを停止し、1 つの書き込みを停止して別のプロセスを読み取りますが、同時に 2 つのプロセスを読み取ることができます。
ブロッキングとは、メソッドが操作が完了するのを待ってから戻ることを意味します。
アップデート
例のリクエストに応えて... 時間があれば例を追加しようとしますが、今のところ、可能性の説明はここにあります。
ロックを実行するには 3 つの方法があります。
IO を実行する 2 つの方法:
open()
通常どおりandを使用するとread()
、ブロッキング IO が発生します。非ブロック IO が必要な場合は、O_NONBLOCK
フラグをopen()
に渡す必要が
あり、ブロックする代わりにread()
返されます。E_AGAIN
デフォルトでは、ロックはありません。またはを呼び出しfcntl()
てロックを取得できます。ロックが利用できない場合、前者はブロックし、後者は or で失敗します。F_SETLK
F_SETLKW
EACCES
EAGAIN
考えられる混乱点は次の 2 つだと思います。
はい、ロックレスとは、ロック機構がないことを意味します。ノンブロッキングとは、何らかの外部イベント (ロックの解放やバッファーへのデータの到着など) が発生するのを待つのではなく、呼び出しがすぐに返されることを意味します。たとえば、呼び出しのように、ロックを設定して非ブロッキング呼び出しを使用することができます
flock(fh, LOCK_SH | LOCK_NB);
これは、「読み取りロックを取得してみてください。取得できない場合は、取得を待たずにすぐに戻って、取得できなかったと伝えてください」という意味です。(「非ブロッキング」LOCK_SH
) なしの (「共有ロック」)のデフォルトの動作は、ロックが使用可能になるまで待機することです。LOCK_NB
これらは似ている場合もありますが、異なるコンテキストで使用されることがよくあります。データ構造のコンテキストでは、それらは同じものになります。IO のコンテキストでも「ノンブロッキング」を使用できます。この場合、関数は操作が完了するのを待ってから戻るか、操作がブロックされないことが確実であることを意味します (たとえば、既にキャッシュされています)。
また、非ブロッキングは、何かがロックレスであることを意味しない場合があります。たとえば、データ構造はロックを使用する場合がありますが、ロックを必要としない非ブロッキング操作とロックを必要とするその他のブロッキング操作があります。
例による暫定的な回答:
と の 2 つのメソッドを持つオブジェクト (「イベント」と呼ばれる) を考えてみましょwait()
うnotify()
。
実装 1:
notify()
アトミックにブール値を設定します。wait()
ブール値が true になるまでループします。どちらもロックレスwait()
ですが、ブロックしています。
実装 2:
notify()
ロックを取得し、ブール値を設定してからロックを解放します。wait()
ロックを取得し、ブール値を読み取り、ロックを解放します。ブール値が true になるまで、これらすべてがループします。したがって、どちらもロックベース、ブロッキングです。
実装 3:
最初はロックが使用されています。notify()
ブール値をチェックし、true の場合はロックを解放します。wait()
ロックを取得し、ブール値を true に設定します。ノンブロッキングnotify()
です(ロックレスかどうかは議論の余地があります)。ロックベース、ブロッキングです。wait()
したがって、非ブロッキングはlocklessを意味すると言えますが、ロックレス操作はループ内の条件に対してブロックされる可能性があるため、それらは同等ではありません。