0

マルチスレッド アクセスが必要な場合は、値型のプロパティでロックを使用しています。また、特に複数のプロジェクトで有用になりつつある私のライブラリ コードでは、適切なアクセス修飾子を適用することにもっと熱心になるつもりでした。私はいくつかのコードを書きましたが、プロパティのさまざまな戦略とそれらがラップするメンバー変数のロックについてコメントを要求したいと思います。ありがとう。

システムを使用する;

公開授業 プログラム
{
    static void Main(string[] args)
    {
        SomeValueType svt = new SomeValueType();
        SomeReferenceType srt = new SomeReferenceType();        
        PermissionsAndLocking p = 新しい PermissionsAndLocking(5, svt, srt);

        //無効。
        //pX = 6;

        //無効
        //p.Svt = new SomeValueType();
        //無効
        //p.Svt.X = 1;
        //有効ですが、Svt は値型であるため、p.Svt のコピーを変更します。
        SomeValueType svt2 = p.Svt;
        svt2.X = 7;

        //無効
        //p.Srt = new SomeReferenceType();
        //有効です。p.Srt のメンバー データを変更します。
        p.Srt.X = 8;        
        SomeReferenceType srt2 = p.Srt;
        srt2.X = 9;

        Console.WriteLine("任意のキーを押してください。");
        Console.Read();
    }
}

パブリック クラス PermissionsAndLocking
{
    //_x はクラス外では変更できません。
    //_x は、アクセスされている「同時に」変更することはできませんか???
    プライベート読み取り専用オブジェクト _xLock = new object();
    プライベート int _x;
    public int X
    {
        得る
        {
            ロック (_xLock)
            {
                _x を返します。
            }
        }
        プライベートセット
        {
            ロック (_xLock)
            {
                _x = 値;
            }
        }
    }

    //_svt とそのメンバーをクラス外に割り当てることはできません。
    //_svt は、アクセスされている「と同時に」変更することはできません。
    プライベート読み取り専用オブジェクト _svtLock = new object();
    プライベート SomeValueType _svt;
    public SomeValueType Svt
    {
        得る
        {
            ロック (_svtLock)
            {
                _svt を返します。
            }
        }
        プライベートセット
        {
            ロック (_svtLock)
            {
                _svt = 値;
            }
        }
    }

    //private on set は = に対して機能しますが、メンバー データは引き続き操作できます...
    //参照が返され、後でアクセスできるため、ロックは完了していません???
    プライベート読み取り専用オブジェクト _srtLock = new object();
    プライベート SomeReferenceType _srt;
    public SomeReferenceType Srt
    {
        得る
        {
            ロック (_srtLock)
            {
                _srt を返します。
            }
        }
        プライベートセット
        {
            ロック (_srtLock)
            {
                _srt = 値;
            }
        }
    }

    public PermissionsAndLocking(int x, SomeValueType svt, SomeReferenceType srt)
    {
        _x = x;
        _svt = svt;
        _srt = srt;
    }
}

public struct SomeValueType
{
    public int X;
}

パブリック クラス SomeReferenceType
{
    public int X;
}
4

2 に答える 2

2

マルチスレッドと並行性について読む必要があります。ロックとは、不変条件が無効である間、つまり、不変条件が無効である間、不変条件が依存している共有メモリへの同時アクセスを防ぐことです。最初のステップは、コードルーチンがどのような不変条件を持っているかを理解することです。次に、コードのどのブロック内で不変条件が無効であるかを理解します。

たとえば、プロパティゲッターには、ロックと同期する必要はありません。プロパティ値のみを読み取ります。この読み取りが行われている間、どの不変条件が無効ですか?変数を読み取り、それをインクリメントしてから、インクリメントされた値をプロパティに書き戻す操作はロックする必要があるかもしれませんが、個々のゲッターとセッターをロックすることは完全に不十分です。読み取りと書き込みを含む操作全体は、保護されたブロック内にある必要があります。

于 2009-09-29T01:32:41.643 に答える
-5
  1. 常にlock静的オブジェクトである必要がある_svtLockため、ロックを有効にするには静的としてマークする必要があります。
  2. _xクラス外で変更することはできません。本当です。を介して変更する必要がありますX
  3. ロックを正しく実装している場合(1を参照)、_xアクセス時に変更することはできません。
于 2009-09-29T01:32:40.340 に答える