10

参照型といくつかのプリミティブ (float は含むが double は含まない、理由はわかりませんが、その理由を聞いてうれしいです) のみが volatile として宣言できるため、クラスで double をラップしてから宣言すると、揮発性として (以下のように)、double プロパティは他の揮発性と同じように「読み書き」スレッドセーフになりますか、それともロックを検討する必要がありますか?

public class MyThreadedClass
{
    volatile VolatileDouble voldub;
}

public class VolatileDouble
{
    public double Double { get; set; }
}
4

4 に答える 4

18

double を volatile と宣言できない理由: 64 ビットであるため、x86 のワード サイズよりも大きくなるため、記憶が正しければ CLI で volatile と宣言できません。

現在の回答では、参照のみが揮発性として扱われます。つまり、メモリ モデルは常に最新の参照を使用するようにしますが、古い値を使用する可能性があります。

私があなたならロックを使用しますが、代替手段の 1 つは、and と組み合わせて longを使用Interlocked.Readし、それに作用することです。これを構造体にカプセル化できます。(私はおそらくそれをクラスではなく構造体にします。)Interlocked.ExchangeBitConverter.Int64BitsToDoubleBitConverter.DoubleToInt64BitsVolatileDouble

于 2009-02-10T10:15:10.477 に答える
5

上記のように動作するには、不変 (セッターなし) にする必要があります。おそらく、便宜上、いくつかの暗黙の変換演算子を使用します。そうしないと、(揮発性の) 参照を変更せずに値を変更する可能性があります。

public class MyThreadedClass
{
    volatile Box<double> volDouble = 123.45;
}

public class Box<T> where T : struct
{
    private readonly T value;
    public Box(T value) { this.value = value; }
    public T Value {get {return value;}}

    // explicit as nulls are a problem...
    public static explicit operator T(Box<T> box) {
        return box.value; }
    public static implicit operator T?(Box<T> box) {
        return box == null ? new T?() : new T?(box.value); }
    public static implicit operator Box<T>(T value) {
        return new Box<T>(value); }
    public static implicit operator Box<T>(T? value) {
        return value.HasValue ? new Box<T>(value.Value) : null; }
}

それを超えて-ロックが最良のオプションです。

于 2009-02-10T10:15:35.703 に答える
3

参照がインスタンスではなく揮発性であることを宣言しているだけなので、問題は解決しません。

于 2009-02-10T10:15:38.917 に答える
0

揮発性のドキュメントは、誤解を招く可能性があります...

msdn のドキュメントで、最新の値を使用していると書かれている場合、それはどういう意味ですか? 単純な値ではこれが混乱を招くことはないと確信していますが、参照についてはどうでしょうか。Brian Rasmussen のように、実際のインスタンスではなく参照 (したがって興味深いデータ) について話しているだけです。

私の観点からは、揮発性を使用することは良い考えではなく、ロックを使用しますが、とにかくこの記事が役立つかもしれません: http://www.bluebytesoftware.com/blog/PermaLink,guid,dd3aff8a-7f8d-4de6- a2e7-d199662b68f4.aspx

于 2009-02-10T11:26:53.073 に答える