2011-07-27 6 views
4

MSDNのドキュメントでは、StreamクラスのStream.Writeを含むインスタンスメソッドはスレッドセーフであることは保証されていませんが、それはどういう意味ですか?あるスレッドが同じオブジェクトの同じメソッドから他のスレッドが返される前にStreamオブジェクトでStream.Writeを呼び出そうとするとどうなりますか?例外がスローされるか、オブジェクトはスレッドの順序に従って送信するデータをキューに入れますか?何人かは、ロック機構なしで電話するのは大丈夫だと言う人もいます。誰かがこれを明確にすることはできますか?Stream.Writeメソッドのスレッドセーフティ

答えて

3

これは、同時に異なるストリームからストリームの同じインスタンスでReadやWriteなどのインスタンスメソッドを決して呼び出さないようにすることを意味します。予期しない動作が発生します。場合によっては、例外がスローされる可能性があります。他のデータが破損している可能性があります。

複数のスレッドから使​​用する場合は、適切なロック機構を使用して、そのような共有リソースへのアクセスを常に同期する必要があります。

+0

オブジェクトの非静的メソッドに対するマルチスレッド呼び出しを行う場合や、ネットワークストリームやファイルアクセスなどの共有リソースに対してのみロックが必要な場合は、ロックを使用するなど、すべてのインスタンスメソッドに一般化できますか?ロック機構を常に使用することが最善であることも知っているので、これらのことを試して経験した人からの回答を得ることは良いことです。ありがとう –

+0

@Alp:クラスが内部的に正しく同期され、スレッドセーフであるようなクラスを作ることは可能です。そのようなクラスでは、外部ロックを使用する必要はありません。多くの場合、ロックを外部的に実装するのがはるかに簡単ですが、適切な操作(例えば、アトミック性を確保するために 'List '要素への読み込みと書き込みのロック)が必要な場合がほとんどです。 'Read'と' Write'も内部的に同期されている可能性がありますが、与えられたすべてのデータを読み書きすることは保証されていないため、操作全体に対して外部ロックが必要です。 –

+0

@Alp Hancioglu、いいえ、私たちは一般化できません。そのため、すべての.NET Frameworkメソッドが文書化され、通常はスレッドセーフであるかどうかを明示的に指定する必要があります。 –

0

書き込みは抽象メソッドです。つまり、そのメソッドの動作はStreamのサブクラスで定義されます。 Streamのサブクラスの中には、スレッドセーフのWriteメソッドを提供するものもあれば、そうでないものもあります。したがって、あなたが扱っている特定のThreadサブクラスが分からない限り、別のスレッドからWriteメソッドを呼び出すと、Streamがどのように動作するのかを言うことはできません。

は、だから、MSDNのストリームのメソッドは、スレッドセーフであることが保証されていないことを言っているので、ストリームオブジェクトを操作する場合、ロックを使用する必要があり、これはおそらく同時に呼び出されたときに破損することがありストリームがあります。

特定のStreamのサブクラスを明示的に使用しており、スレッドセーフであることがわかっている場合は、ロックする必要はありません。

関連する問題