MSDNのドキュメントでは、StreamクラスのStream.Writeを含むインスタンスメソッドはスレッドセーフであることは保証されていませんが、それはどういう意味ですか?あるスレッドが同じオブジェクトの同じメソッドから他のスレッドが返される前にStreamオブジェクトでStream.Writeを呼び出そうとするとどうなりますか?例外がスローされるか、オブジェクトはスレッドの順序に従って送信するデータをキューに入れますか?何人かは、ロック機構なしで電話するのは大丈夫だと言う人もいます。誰かがこれを明確にすることはできますか?Stream.Writeメソッドのスレッドセーフティ
4
A
答えて
3
これは、同時に異なるストリームからストリームの同じインスタンスでReadやWriteなどのインスタンスメソッドを決して呼び出さないようにすることを意味します。予期しない動作が発生します。場合によっては、例外がスローされる可能性があります。他のデータが破損している可能性があります。
複数のスレッドから使用する場合は、適切なロック機構を使用して、そのような共有リソースへのアクセスを常に同期する必要があります。
0
書き込みは抽象メソッドです。つまり、そのメソッドの動作はStreamのサブクラスで定義されます。 Streamのサブクラスの中には、スレッドセーフのWriteメソッドを提供するものもあれば、そうでないものもあります。したがって、あなたが扱っている特定のThreadサブクラスが分からない限り、別のスレッドからWriteメソッドを呼び出すと、Streamがどのように動作するのかを言うことはできません。
は、だから、MSDNのストリームのメソッドは、スレッドセーフであることが保証されていないことを言っているので、ストリームオブジェクトを操作する場合、ロックを使用する必要があり、これはおそらく同時に呼び出されたときに破損することがありストリームがあります。
特定のStreamのサブクラスを明示的に使用しており、スレッドセーフであることがわかっている場合は、ロックする必要はありません。
関連する問題
- 1. 静的メソッドとスレッドセーフティのローカル変数
- 2. Spring JpaRepositoryメソッドのスレッドセーフティについて
- 3. スレッドセーフティ、アプリケーションデザイン
- 4. スレッドセーフティSocketOutputStream
- 5. スレッドセーフティ(Paralel.For)
- 6. エンティティフレームワークのスレッドセーフティ
- 7. スレッドセーフティの問題
- 8. C2664エラーstream.writeはunsigned char *
- 9. cTAKESとスレッドセーフティ
- 10. MDFファイルのスレッドセーフティへのアクセス
- 11. スタティックメソッドのスレッドセーフティの確保C#
- 12. Statement.cancel()とスレッドセーフティの保証
- 13. スレッドセーフティとJavaでのインスタンス
- 14. テンプレートタグを使用したスレッドセーフティ
- 15. スタティッククラスのスレッドセーフティのASP.NET非静的クラス
- 16. @PersistenceContext SpringとJava EEでのEntityManagerのスレッドセーフティ
- 17. .NETでの並列タスクのスレッドセーフティ
- 18. スレッドセーフティでシングルトンのプロパティを更新する
- 19. GetDC/ReleaseDCのIDXGISurface1スレッドセーフティ/同期ルール?
- 20. MediaElementの同じファイルを再生しているときにStream.Writeメソッドを使用できない
- 21. stream.writeを使用したときの入出力間のデータの不一致
- 22. Javaスレッドセーフティ:メソッドを呼び出すときにインスタンス変数を処理する方法
- 23. 単純な整数メンバー変数を返すときのスレッドセーフティ
- 24. IDictionaryとConcurrentDictionaryのスレッドセーフティに関する考慮
- 25. スレッドセーフティ:異なるNSMutableDictionaryエントリにアクセスする2つのスレッド
- 26. Rails 3でスレッドセーフティをテストする方法は?
- 27. 書込みコレクションのコピーはスレッドセーフティをどのように提供しますか?
- 28. JSPからインスタンス化されたオブジェクトのスレッドセーフティに関する懸念
- 29. Stream.Writeを使用して、より多くの領域を正しく予約する方法は?
- 30. どのようにonCreate()の新しいスレッド情報を取得し、スレッドセーフティを維持するには?
オブジェクトの非静的メソッドに対するマルチスレッド呼び出しを行う場合や、ネットワークストリームやファイルアクセスなどの共有リソースに対してのみロックが必要な場合は、ロックを使用するなど、すべてのインスタンスメソッドに一般化できますか?ロック機構を常に使用することが最善であることも知っているので、これらのことを試して経験した人からの回答を得ることは良いことです。ありがとう –
@Alp:クラスが内部的に正しく同期され、スレッドセーフであるようなクラスを作ることは可能です。そのようなクラスでは、外部ロックを使用する必要はありません。多くの場合、ロックを外部的に実装するのがはるかに簡単ですが、適切な操作(例えば、アトミック性を確保するために 'List'要素への読み込みと書き込みのロック)が必要な場合がほとんどです。 'Read'と' Write'も内部的に同期されている可能性がありますが、与えられたすべてのデータを読み書きすることは保証されていないため、操作全体に対して外部ロックが必要です。 –
@Alp Hancioglu、いいえ、私たちは一般化できません。そのため、すべての.NET Frameworkメソッドが文書化され、通常はスレッドセーフであるかどうかを明示的に指定する必要があります。 –