2009-03-18 4 views
5

.NETでは、クラスまたはメソッドがスレッドセーフであるかどうかをどのように知ることができますか?デフォルトではスレッドセーフではありませんか?.NETでスレッドセーフなクラスまたはメソッドをマークする属性はありますか?

+0

このような属性をどのような目的で使用したいですか? – AnthonyWJones

+1

クラスユーザーに警告するためのコード文書の一種であるかもしれません。 –

+0

文書化が必要な場合は、セクションに入れることができます。 –

答えて

6

これは属性ではありません。関心のある項目ごとにドキュメントを読む必要があります。属性を追加するだけでスレッドセーフなものにすることはできません。それは、オレンジ色をして "Apple"というステッカーを貼るようなものです。

もちろん、シリアル化でも同じことが当てはまりますが、それでも停止するわけではありませんが、属性はありません。ドキュメントを読む。

+0

すべての静的メソッドとプロパティはデフォルトでスレッドセーフであると仮定されています。彼らはそうではないということです。 – Richard

+0

メソッドがスレッドセーフではないと仮定すると、害を及ぼすことはありません。何も言わない方がいいと言わない限り、スレッドセーフです。 – JoshBerke

1

私はこの1人のJoel Coehoornに背中を抱き、そのような主張を「偽造」するのは簡単でしょう。

using System.Runtime.CompilerServices; 
[MethodImpl(MethodImplOptions.Synchronized)] 
void MyMethod() 
{ 
DoSomething(); 
} 
+0

私はそれを「偽造」するほど心配しません。しかし、並行処理は難しい:バグが抜けてしまっている可能性が高く、その属性は間違っている可能性が高い。 –

+2

しかし、属性が間違っていると、ドキュメントがあればそれも正しくない可能性があります。 –

+0

私は完全に@JimMischelに同意しますが、ジョエルはドキュメンテーションの主張者ではありませんでした。少なくとも属性は機械可読であり、帰属するメソッドの自動列挙、フィルタリング、報告などを可能にし、潜在的には静的解析および/またはエラー防止の弱い形態さえも可能にする。属性は行かなければなりませんが、真に有用な方法で並行性セマンティクスを取得するためには、複雑で包括的なシステムが必要です。 .NETの場合、私はそのようなデザインや提案は認識していません。 –

-1

をスレッドセーフテキストを追加しませんIContributeObjectSink/IContextAttribute経由でオブジェクトへのすべてのアクセスを可能にすることは可能ですが、オブジェクトにサブクラスMarshalByRefObject、コンテキスト作成オーバーヘッドなどが必要となるため、パフォーマンスが大幅に低下します。

+0

問題は次のとおりです。これは、メソッドがスレッドセーフであることを意味するものではありません。別のスレッドが[MethodImpl]を持たない別のメソッドを呼び出している可能性があります。同様に、すべてのフィールドが読み込み専用であっても、子オブジェクトのフィールドは変更可能であり、問​​題を引き起こす可能性があります。 –

+0

この "コーディングスタイル" *が何かを表すことができても(このページの他の多くのコメントを参照)、 'MethodImplOptions.Synchronized'フラグは、OPが探しているものとは逆の意味を持ちます。このフラグは、メソッドが**スレッドセーフではないことを示すためのものです。ドキュメントから: "一度に1つのスレッドだけでメソッドを実行できます。" –

1

それは:

なぜ同期クラスを作るのないユースケースシナリオは限り方法に関しては次のようなコーディングスタイルを使用し、存在しない機能の説明に

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); } 

上記のコードは、あなたが呼び出した時刻の間にリストが変更される可能性があるため(遅かれ早かれ)、クラッシュします

関連する問題