3

現在、C# WPF アプリケーションを作成しています。3 つのスレッドから変数への読み取り/書き込みのための同期アクセスが必要です。この変数は、アプリケーションのメイン ウィンドウ クラスのメンバーとして宣言されます。そこで、次のように宣言しました。

public partial class MainWindow : Window
{
    . . . . .
    #region Fields
    /// <summary>
    /// The variable myVar to synchronous access for read/write. 
    /// </summary>
    private static Double myVar;
    #endregion
    . . . . .
}

次の方法で同期アクセスを提供できますか。

1) 同期オブジェクトを MainWindow クラスのメンバーとして定義する

public partial class MainWindow : Window
{
    . . . . .
    #region Fields
    /// <summary>
    /// This object is controlling the synchronous access for read/write to myVar. 
    /// </summary>
    private static Object syncObj;
    #endregion
    . . . . .
}

2) MainWindow クラスで次のプロパティを定義します。

public partial class MainWindow : Window
{
    . . . . .
    #region Properties
    /// <summary>
    /// This property supports synchronous access to myVar for read/write. 
    /// </summary>
    public static Double MyVar
    {
        lock(syncObj)
        {
            get{ return myVar; }
            set{ if(myVar != value) myVar = value; }
        }
    } 
    #endregion
    . . . . .
}

このプロパティは正しく機能しますか? myVar 変数への読み取り/書き込みのための同期アクセスの確実な方法は保証されますか? volatile またはメソッドを Thread.VolatileRead および Thread.VolatileWrite として使用したくありません。多くの人がロック演算子の方がうまく機能し、コンパイラがコードを最適化できると言っているからです。

4

3 に答える 3

1

メイン ウィンドウがプライベート変数自体を参照するのではなく、プロパティを参照する限り、これはまったく問題ないように思えます。

lock ステートメントから(C# リファレンス)

lock キーワードは、特定のオブジェクトの相互排除ロックを取得し、ステートメントを実行してからロックを解放することにより、ステートメント ブロックをクリティカル セクションとしてマークします。

lock キーワードは、別のスレッドがクリティカル セクションにある間に、あるスレッドがコードのクリティカル セクションに入らないようにします。別のスレッドがロックされたコードを入力しようとすると、オブジェクトが解放されるまでブロックされます。

注目すべきもう 1 つの興味深いオプションは、ReaderWriterLockSlim クラスです。

リソースへのアクセスを管理するために使用されるロックを表し、読み取り用の複数のスレッドまたは書き込み用の排他的アクセスを許可します

于 2012-09-28T05:54:09.913 に答える
0

あなたの方法は機能しますが、次の方法を使用してパフォーマンスを向上させることができます:http Interlocked.CompareExchange: //msdn.microsoft.com/en-us/library/cd0811yf.aspx

于 2012-09-28T09:58:18.103 に答える
0

StackOverflowユーザーの悲しい一人として、あなたのアプローチには何も問題はないと思います。個人的には、コード実行中の同期プロセスに関して非常に興味深いと思われるので、ReaderWriterLockSlim クラスを確認することもお勧めします。それらのルールに従うだけです

lock (this) is a problem if the instance can be accessed publicly.

lock (typeof (MyType)) is a problem if MyType is publicly accessible.

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.
于 2012-09-28T09:54:49.497 に答える