2011-02-02 12 views
1

私は2つのクラスを持っています - クラス 'MyDerived'は、抽象基本クラス 'MyBase'から派生しています。 PrimaryDerivedClassMyBaseを継承します。 私はまずPrimaryDerivedClassのインスタンスを作成し、インスタンスを作成して 'MyDerived'を作成します。なぜ揮発性変数は通常非公開ですか?

MyBasePrimaryDerivedClassMyDerivedの新しいインスタンスが作成されるときThreadPool.QueueUserWorkItem(ProcessThread)のように使用されてProcessThreadと呼ばれるプロテクトメソッドを持っています。今、私はいくつかのシナリオですべてのスレッドを停止したい場合、私はいくつかのブール揮発性変数をTRUEに設定していて、他のスレッドが揮発性変数の値= TRUEを見つけると、処理を停止します。

private volatile bool stopThreads」をMyBaseに宣言したとき、意図した動作が得られませんでした。しかし、私がそれをstaticまたはpublicにしたとき、私が痛感しようとしているものを見ることができました。 プライベート揮発性の場合はどうなりますか?

上記の要件を脇に置いて、さらに質問があります。 通常、揮発性変数はプライベートと宣言されています。重要な側面はありますか?通常、プライベートと宣言されていますか?

(私はマルチスレッドに新しいです。)

+1

揮発性を避けることができます。http://www.bluebytesoftware.com/blog/2010/12/04/SayonaraVolatile.aspx – TrueWill

+0

@TrueWill:ありがとうございます。 – Learner

答えて

2

ありませんプライベートからパブリックへのアクセス修飾子を変更すると、揮発性のフィールドの動作には影響を与えません(少なくとも、揮発性ではありません)。他にも問題がありますが、コードを見ずに推測することはできません。

マルチスレッドのデバッグは難しいですが、コードの実行方法は非決定的です。スレッドがいつ正確に実行されるかは予測できません。

揮発性フィールドがプライベートであるという事実は、それらがクラスによって内部的に同期化に使用されるという事実です。それらは実装の一部であり、インタフェースではありません。

+0

私はあなたに同意します。揮発性フィールドが静的になったとき(パブリックに変更することなく)、期待どおりに動作します。それは理にかなっていますか?そして、とにかく、なぜ揮発性変数は通常非公開に保たれていますか? – Learner

+1

@CSharpLearning Waitを見てみましょう私はあなたがMyDerivedクラスの複数のインスタンスを正しく持っていると思っています。 stopThreadsを設定すると、作成した各インスタンスごとに設定するか、または1回だけ設定します。 stopThreadsが静的でない場合、クラスの各インスタンスには独自のコピーがあります。stopThreadsはそのインスタンスにのみ影響します。 stopThreadsをstaticに変更すると、クラスのすべてのインスタンスが同じフィールドを共有するため、設定する共有コピーは1つだけです。それが問題である場合は、マルチスレッドとボラティリティとは関係ありません。 – shf301

+0

回答としてマーク – Learner

1

揮発性フィールドはフィールドであり、volatileではないためプライベートです。値を公開する必要がある場合は、プロパティを使用して、実装の詳細を非表示にすることができます。

この場合、obj.StopThreads = trueを呼び出すコードを変更することなく、volatile BooleanManualResetEventに変更することができます。 Stop()という名前のメソッドは、すべて一緒にプロパティより優れていると主張されるかもしれません。

1

この「奇妙な」振舞いは単にアクセス修飾子のためです。 privateは、この変数が定義されたクラスからのみアクセス可能であることを意味します。派生クラスはすべてアクセス権がありません。したがって、基底クラスの揮発性変数の値を変更すると、の基底クラス内部のみが変更されます。

ベースから継承するすべてのクラスは、stop-right-nowという独自の実装を持つ必要があります。しかし、この変数をpublic(アクセス制限なし、どこからでもアクセス可能)または静的(つまり、インスタンスにではなくクラスに属し、アクセス可能であるため、すべてのインスタンスで同じ値を意味するクラス名ではインスタンスではありません)。変数にデリバティブがアクセスできるようにするには、その変数にprotectedとマークする必要があります。

http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx - この記事では、アクセス修飾子の意味を示します。

関連する問題