.NETでは、クラスまたはメソッドがスレッドセーフであるかどうかをどのように知ることができますか?デフォルトではスレッドセーフではありませんか?.NETでスレッドセーフなクラスまたはメソッドをマークする属性はありますか?
答えて
これは属性ではありません。関心のある項目ごとにドキュメントを読む必要があります。属性を追加するだけでスレッドセーフなものにすることはできません。それは、オレンジ色をして "Apple"というステッカーを貼るようなものです。
もちろん、シリアル化でも同じことが当てはまりますが、それでも停止するわけではありませんが、属性はありません。ドキュメントを読む。
私はこの1人のJoel Coehoornに背中を抱き、そのような主張を「偽造」するのは簡単でしょう。
using System.Runtime.CompilerServices;
[MethodImpl(MethodImplOptions.Synchronized)]
void MyMethod()
{
DoSomething();
}
私はそれを「偽造」するほど心配しません。しかし、並行処理は難しい:バグが抜けてしまっている可能性が高く、その属性は間違っている可能性が高い。 –
しかし、属性が間違っていると、ドキュメントがあればそれも正しくない可能性があります。 –
私は完全に@JimMischelに同意しますが、ジョエルはドキュメンテーションの主張者ではありませんでした。少なくとも属性は機械可読であり、帰属するメソッドの自動列挙、フィルタリング、報告などを可能にし、潜在的には静的解析および/またはエラー防止の弱い形態さえも可能にする。属性は行かなければなりませんが、真に有用な方法で並行性セマンティクスを取得するためには、複雑で包括的なシステムが必要です。 .NETの場合、私はそのようなデザインや提案は認識していません。 –
をスレッドセーフテキストを追加しませんIContributeObjectSink/IContextAttribute
経由でオブジェクトへのすべてのアクセスを可能にすることは可能ですが、オブジェクトにサブクラスMarshalByRefObject
、コンテキスト作成オーバーヘッドなどが必要となるため、パフォーマンスが大幅に低下します。
問題は次のとおりです。これは、メソッドがスレッドセーフであることを意味するものではありません。別のスレッドが[MethodImpl]を持たない別のメソッドを呼び出している可能性があります。同様に、すべてのフィールドが読み込み専用であっても、子オブジェクトのフィールドは変更可能であり、問題を引き起こす可能性があります。 –
この "コーディングスタイル" *が何かを表すことができても(このページの他の多くのコメントを参照)、 'MethodImplOptions.Synchronized'フラグは、OPが探しているものとは逆の意味を持ちます。このフラグは、メソッドが**スレッドセーフではないことを示すためのものです。ドキュメントから: "一度に1つのスレッドだけでメソッドを実行できます。" –
それは:
なぜ同期クラスを作るのないユースケースシナリオは限り方法に関しては次のようなコーディングスタイルを使用し、存在しない機能の説明に
いいえ、それは無意味です。
void Add(something);
void Remove(index);
int GetCount();
something GetElementAt(index);
スレッド1:
for 1 to 100 do
list.Add(12);
スレッド2と3:
するのは、私は、スレッドセーフリストを持っていると仮定しましょう、それは方法™安全な3つのスレッドを持っています
while(list.GetCount() >0) { list.Remove(0); }
上記のコードは、あなたが呼び出した時刻の間にリストが変更される可能性があるため(遅かれ早かれ)、クラッシュします
- 1. .NETにはスレッドセーフな汎用クラスがありますか?
- 2. DebuggerStepThrough属性でマークされたメソッドを中断できますか?
- 3. attr_accessor属性をクラス内(ただしメソッドの外側)で呼び出す方法はありますか?
- 4. Webアプリケーションのコンテキスト属性をスレッドセーフにする必要がありますか?
- 5. クラスには属性がありません。セットはありますが、
- 6. 無効な属性または属性パラメータに対してスローする例外はありますか?
- 7. UIスレッドでマーシャリングされたメソッドはスレッドセーフである必要があります
- 8. .netメソッドの属性
- 9. NUnit Assert.ThrowsメソッドまたはExpectedException属性を使用しますか?
- 10. エラー:「属性クラスではありません」ConfigurationElementType属性を使用する場合
- 11. iPhone:NSObjectの属性をループする方法はありますか?
- 12. C#4には一般的な属性がありますか?
- 13. JavaにはC#のような属性がありますか?
- 14. ログファイルに現在のメソッドをマークする方法はありますか?
- 15. Rails Model.select(属性*属性AS new_attribute) - new_attributeはハッシュではありませんか?
- 16. MetadataType属性は、クラスをMVCの検証クラスとしてどのようにマークしますか?
- 17. .NETモジュールはスレッドセーフですか?
- 18. には、。NET用の標準Webフォーム(MVCではなく)に相当するauthorize属性があります。
- 19. railsのビューでhtml要素にクラス属性を追加する最もクリーンな方法はありますか
- 20. cgiのstart_html()メソッドには複数の-script属性がありますか?
- 21. 私のIBackingStoreはスレッドセーフである必要がありますか?
- 22. PRNGはスレッドセーフである必要がありますか?
- 23. MongoCollection.forEachはスレッドセーフである必要がありますか?
- 24. メソッドを確認するカスタム.NET属性戻り値の型
- 25. PHP/WAMPで使用するバイナリ - スレッドセーフでスレッドセーフではありませんか?
- 26. クラスまたはIDのないdivに属性値を追加しますか?
- 27. デバッガ内のプロパティ評価を防止するための.Net属性はありますか?
- 28. クラスに[DataContract]属性または[Serializable]属性のいずれかを付けてシリアル化する必要があるのはなぜですか?
- 29. なぜ 'object'クラスにユーザ設定属性がありません
- 30. PureLayoutはスレッドセーフではありません
このような属性をどのような目的で使用したいですか? – AnthonyWJones
クラスユーザーに警告するためのコード文書の一種であるかもしれません。 –
文書化が必要な場合は、 セクションに入れることができます。 –