- ベストアンサー
スレッドセーフとはどういう意味ですか?
このメンバはスレッドセーフです。 ただし、インスタンスメンバの場合は、スレッドセーフとは限りません。 マルチスレッド対応のクラスで使用すると、値が保証できないということですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> メソッドがマルチスレッドに対応しているということですね。 > それでスレッドセーフと言います。 表現がわずかに違うだけですが、メソッド自体は基本的にマルチスレッドに対応します。ただし、スレッドセーフでない場合は『処理結果に矛盾が生じることがある』ということです。 「スレッドセーフでないメソッドはマルチスレッドでは使えない」と解釈してしまうのは間違いですので、念のため補足しておきます。 スレッドセーフとは、『マルチスレッド環境下の動作で矛盾が発生しないこと』を保証するものであり『設定された値』を保証するものではありません。
その他の回答 (1)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
スレッドセーフとは、複数のスレッドからひとつのメンバにアクセスした際、同じタイミングであっても処理の衝突や矛盾が起こらずに正しく処理されることが保証されている機構のことです。 質問文のケースでは、Sharedなメンバであればスレッドセーフになっているが、インスタンスを作成したクラスの場合はそれが保証されない、ということを言っていると思います。 > マルチスレッド対応のクラスで使用すると、値が保証できない マルチスレッドにおいてインスタンスを作成したクラスから使用すると、スレッドセーフが保証されない。 と言ったほうがより正確ですね。 スレッドセーフを知るにはマルチスレッド全体について知る必要がありますので、参照URLに私がよく読む記事を載せておきます。
お礼
ありがとうございます。 メソッドがマルチスレッドに対応しているということですね。 それでスレッドセーフと言います。 参考URL拝見しました。 Invokeメソッドとか、用語が日々作られているようで古株でないと用語すらわからない状況です。 値が保証されるインスタンスを作成しないクラスというのは・・・ 1. オブジェクトを先に生成して、オブジェクト型をメソッドに投げたら保証するメソッドということですか? 2. オブジェクト型を投げると保証はできないが、基本型(参照型・値型)なら保証するメソッドということですか? インスタンスを作成しないクラスって・・・・
お礼
ありがとうございます。 値を保証するのではなく、処理が完了できずに、 処理が身動きが取れなくなるデッドロックが発生しないように作成されたメソッドをスレッドセーフというのですね。 スレッドプール・デリゲートさせてのコールバック・タイマー・排他制御・同期制御・・・ Visual Basicの名前空間にあるクラスのソースコードは見ることができないんですか? 著作権の関係上非公開なんですかね・・・ マルチスレッドの使いどころがDBとかならわかりますが、いまのところソフトに・・電卓に・・応用できそうにないですね。 もうちょっと勉強してからスレッドセーフは学びたいと思います。