5

私のクラスの1つには、Guidタイプのプロパティがあります。このプロパティは、複数のスレッドで同時に読み取りと書き込みを行うことができます。Guidへの読み取りと書き込みはアトミックではないという印象を受けているので、それらをロックする必要があります。

私はこのようにすることを選択しました:

public Guid TestKey
{
    get
    {
        lock (_testKeyLock)
        {
            return _testKey;
        }
    }

    set
    {
        lock (_testKeyLock)
        {
            _testKey = value;
        }
    }
}

(私のクラス内では、Guidへのすべてのアクセスも、_testKeyに直接アクセスするのではなく、そのプロパティを介して行われます。)

2つの質問があります:

(1)読み取りの破損を防ぐために、そのようにGUIDをロックする必要が本当にありますか?(確かにそうです。)

(2)それはロックを行うための合理的な方法ですか?または、次のようにする必要がありますか?

get
{
    Guid result;

    lock (_testKeyLock)
    {
        result = _testKey;
    }

    return result;
}

[編集]この記事は、Guidsが読み取りの破損に苦しむことを確認しています:http://msdn.microsoft.com/en-us/magazine/jj863136.aspx

4

2 に答える 2

8

1:はい; 1つのスレッドの読み取りと1つの書き込みがある場合に、値の破損から保護するため。Guidアトミックであることが保証されていません

2:「次のように」:それらは事実上同じです。ILレベルでは、 /ブロックからは取得できない ため、コンパイラは、2番目の例と同様に、ローカル変数を導入して最初の例を実装します。rettrycatch

別のアプローチはそれを箱詰めすることかもしれません。参照アトミックです:

object boxedTestKey;
public Guid TestKey
{
    get { return (Guid)boxedTestKey; }
    set { boxedTestKey = value; }
}

ロックは必要ありませんが、ボックスからわずかなオーバーヘッドがあります。

于 2013-02-01T13:55:56.623 に答える
4

1)読み取りの破損を防ぐために、そのようにGUIDをロックする必要が本当にありますか?(確かにそうです。)

はい、そうです。

2)それはロックを行うための合理的な方法ですか?

繰り返しますが:はい​​。

Interlockedそのための方法があったとしたらGuid、それはもっと良かった(より速い)でしょう。

double(別の非アトミック構造体)の場合はサポートがありInterlocked、参照の場合は必要ありません。

したがって、パターンとして、これはでサポートされていない大きな構造体にのみ必要ですInterlocked

于 2013-02-01T13:55:22.690 に答える