12

私は、仲間の開発者 (それ以来去った) がこのコードに問題がないかどうか疑問に思っています。これと単純なロックを使用するだけでパフォーマンスに違いはありますか?

    private long m_LayoutSuspended = 0;
    public void SuspendLayout()
    {
        Interlocked.Exchange(ref m_LayoutSuspended, 1);
    }

    public void ResumeLayout()
    {
        Interlocked.Exchange(ref m_LayoutSuspended, 0);
    }

    public bool IsLayoutSuspended
    {
        get { return Interlocked.Read(ref m_LayoutSuspended) != 1; }
    }

ロックがあればもっと簡単にできると思っていたのですが?確かに複数のスレッドで使用されるため、ロック/インターロックの使用が決定された理由です。

4

2 に答える 2

14

はい、あなたがやっていることは、フィールドに到達するレースの観点からは安全ですがm_LayoutSuspended、コードが次のことを行う場合、次の理由でロックが必要です:

if (!o.IsLayoutSuspended)  // This is not thread Safe .....
{
  o.SuspendLayout();   // This is not thread Safe, because there's a difference between the checck and the actual write of the variable a race might occur.
  ...
  o.ResumeLayout();
} 

CompareExchange競合状態が発生していないことを確認するために使用する、より安全な方法:

private long m_LayoutSuspended = 0;
public bool SuspendLayout()
{
    return Interlocked.CompareExchange(ref m_LayoutSuspended, 1) == 0;
}

if (o.SuspendLayout()) 
{
  ....
  o.ResumeLayout();
}

または、単にロックを使用することをお勧めします。

于 2009-09-07T13:48:22.777 に答える
10

個人的には、揮発性ブール値を使用します。

private volatile bool m_LayoutSuspended = false;
public void SuspendLayout()
{
    m_LayoutSuspended = true;
}

public void ResumeLayout()
{
    m_LayoutSuspended = false;
}

public bool IsLayoutSuspended
{
    get { return m_LayoutSuspended; }
}

繰り返しになりますが、最近他の場所で認めたように、揮発性は私が思っていたものとはまったく異なります。これは大丈夫だと思いますが:)

に固執してもInterlocked、私はそれをに変更しintます... 32ビットで簡単に実行できる場合、32ビットシステムが64ビット書き込みをアトミックにするのに潜在的に苦労する必要はありません...

于 2009-09-07T13:31:41.487 に答える