0

リーダー/ライターに少し問題があります。

多くのリーダーとライターが同時にアクセスできる特定のオブジェクトの静的コレクションがあります。

ライターはコレクションハンドラーからアイテムを取得し、それを何らかの方法で変更します。

読者は、コレクションハンドラーからその特定のアイテムを取得し、それを何らかの方法で表示することができます。

この問題の標準的な解決策は、ロック(またはReaderWriterロック)を作成し、各ライターとリーダーにロックを強制的に入力させることです。問題は、リーダー/ライターを追加しているのは私だけではないということです。そのため、誰かが実装でロックを使用するのを忘れて、すべてを壊してしまう可能性があります。

では、オブジェクトの側から、すべての変更をアトミックな方法で強制的に行う方法はありますか?このオブジェクトは複数の形式で拡張され、この方法で制限する必要があることに注意してください。

4

1 に答える 1

2

オブジェクトのコンシューマーが安全規則に従うことを信頼できない場合は、大きな問題が発生します。私は2つの解決策を見ることができます:

1)何もしません。あなたの消費者が壊れたコードを書いた場合、彼らが自分自身を見つける苦痛はそれを二度としないことへの良いインセンティブになるでしょう。

1a)たとえば、オブジェクトが読み取りロックなしで読み取られていることを何らかの方法で検出し、例外をスローすることで、彼らの苦痛をさらに耐え難いものにすることができます。これは、JScriptおよびVBScriptエンジンのスレッドルールを設計するときに行ったことです。ユーザーがそのメソッドをサポートしていないスレッドでメソッドを呼び出すと、エンジンは「壊滅的な失敗」エラーコードを返します。エンジンのユーザーは、その間違いを2度犯すことはありません。彼らは、どちらが正しいスレッドでどれが間違ったスレッドであるかを非常にすばやく学習し、間違ったスレッドの呼び出しを停止します。

これは、呼び出しをほとんどの時間成功させてから、100万回に1回、クレイジーな競合状態の問題で死ぬよりもはるかに優れたソリューションです。

2)ロックを取得する責任をオブジェクトに移します。コンシューマーにオブジェクトを通常どおりに使用させます。オブジェクトは、読み取りまたは書き込みが行われるたびに、独自のリーダーライターロックを解除します。

于 2013-02-10T15:12:50.867 に答える