問題タブ [readwritelock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - より基本的な同期プリミティブから複数読み取り/単一書き込みロックを作成する方法は?
私たちのコードには、ミューテックスによって保護されたデータの同時読み取りがかなり一般的であり、書き込みはめったに行われない場所がいくつかあることがわかりました。私たちの測定によると、単純なミューテックスを使用すると、そのデータを読み取るコードのパフォーマンスが大幅に低下するようです。したがって、必要なのは複数読み取り/単一書き込みミューテックスです。これがより単純なプリミティブの上に構築できることはわかっていますが、これを試す前に、既存の知識を求めたいと思います。
単純な同期プリミティブから複数読み取り/単一書き込みロックを構築する承認済みの方法は何ですか?
私はそれを作る方法を知っていますが、私が(おそらく間違って)思いついたことに偏りのない答えが欲しい. (注:私が期待しているのは、おそらく完全な実装ではなく、疑似コードでの方法の説明です。確かに自分でコードを書くことができます。)
警告:
これには、妥当なパフォーマンスが必要です。(私が念頭に置いていることは、アクセスごとに 2 つのロック/ロック解除操作が必要になることです。これでは十分ではないかもしれませんが、代わりに多くの操作が必要になるのは不合理に思えます。)
一般に、読み取りはより多くなりますが、書き込みは読み取りよりも重要であり、パフォーマンスに影響されます。読者は作家を飢えさせてはなりません。
私たちは、かなり古い組み込みプラットフォーム (VxWorks 5.5 の専有バージョン)、かなり古いコンパイラ (GCC 4.1.2)、およびブースト 1.52 に固執しています。ただし、POSIX は完全には実装されていないため、POSIX に依存するブーストのほとんどの部分を除きます。そのプラットフォームで。基本的に使用可能なロック プリミティブは、いくつかの種類のセマフォ (バイナリ、カウンティングなど) であり、その上にミューテックス、条件変数、およびモニターが既に作成されています。
これはIA32、シングルコアです。
c - C での読み取り/書き込みロックのスレッド セーフな破棄
POSIX セマフォを使用して C でスレッドセーフな読み書きロックを作成しようとしています。ソース コードの現在の状態は、こちらで確認できます。これに従って、読者優先のロックを作成しました。
問題は、rwl_destroy() が呼び出されたときに発生する可能性のある状態のロックの破棄を処理したいということです。
destroy が呼び出され、他のスレッドがロックされていない場合、wrt (ライターによって使用される) をロックして、他のスレッドがロックによって保護されたデータにアクセスできないようにします。次に、destroy 関数はセマフォを破棄し、ReadWriteLock 構造体に割り当てられたメモリを解放する必要があります。しかし、別のスレッドがロックを待機している場合はどうなるでしょうか。ドキュメントによると、このスレッドは未定義の状態のままになります。
ロックを使いやすくするために、それを避けようとしています。
編集:
現在のコードは次のとおりです。
私はこれらの機能も持っています:
したがって、私の質問は、上記で説明した未定義の状態を回避するために、これらの関数をどのように変更するかです。ReadWriteLock を破棄しようとする前に、このコードのユーザーがすべてのロックを解放することは可能ですか?
isActive() 関数と delFlag セマフォは現在使用されていません。問題を解決するために作成されました。
java - Java ReadWriteLock を使用してキャッシュされたデータを同期する - 状態変数を揮発性とマークするかどうか?
Oracleの ReadWriteLock javadocとその実装volatile
では、ロックの機能と使用方法について説明していますが、キーワードを使用するかどうかについては何も述べていません。
これはdo-all-mutable-variables-need-to-be-volatile-when-using-locksと同じ質問ではありません。なぜなら、ロックがアクセスと可視性を適切に同期させることを嬉しく思いますがvolatile
、たとえば、コンパイラの最適化やその他の理由で、変数はまだ良い考えですか?
私のキャッシュされたデータは、めったに変更されず、オブジェクトのさまざまな属性を使用してリスト内のオブジェクトをマッピングするList
いくつかのデータで構成されています。Maps
最良の宣言は何でしょうか? 私はこれを持っています:
c++ - C++14 でリーダー/ライター ロックを実装する方法
リーダー/ライター ロックを使用してスレッド セーフにしたいハッシュ テーブル データ構造があります (私の読み取り:書き込み比率は 100:1 の領域のどこかにある可能性があります)。
私は C++11 を使用してこのロックを実装する方法 (メソッド here など)を探していましたが、C++14 を使用shared_lock
して同じことを達成できるはずであることに気付きました。ただし、cppreferencestd::shared_lock
を調べたところ、両方を見つけましstd::unique_lock
たが、それらを一緒に使用する方法がわかりません(一意と共有モードの両方でロックするための単純なメソッド呼び出しを持つブースト方法と比較して)。
標準ライブラリのみを使用して、この比較的単純なリーダー/ライター ロック インターフェイスを C++14 で再作成するにはどうすればよいですか?
java - JavaでReadWriteLockを使用してキャッシュを実装する方法は?
私の主な質問は、「次のコード
の値を本当に再確認する必要がありますか?」ということです。
次のコードは、ReadWriteLock を使用してキャッシュを実装する方法を示しています。
}
「line3」の値を再確認する必要があるかどうか
私が知っているように、値オブジェクトは、3 行目に実行されるときに null でなければなりません。これは、ローカル変数(null の場合) であり、メインの obj:ReadWriteLockCache の状態変数にすることはできないためです
。
実際にすべきことは、get メソッドを呼び出して、キーの値が他のスレッドによって格納されているかどうかを確認することです。
コードは次のようになります。
誰でも助けることができますか?私は正しいですか? よくわかりません。