Interlocked.CompareExchange の疑似コード
スレッドセーフに変数の数値比較を実施する場合、Interlocked.CompareExchange というメソッドを利用する必要がありますが、MSDNに書いてある引数の解説が意味不明です。何度よんでも覚えられません。
実際は下記のような疑似コードで説明できます。
public int MyCompareExchange(
ref int TheValue,
int replace_value_when_TheValue_epuals_value_compare,
int value_compare
)
{
int tmp = TheValue;
if ( tmp == value_compare )
{
// 同じ値だったら更新する.
TheValue = replace_value_when_TheValue_epuals_value_compare;
}
return tmp;
}
このコードを用いて、ウインドウの色を塗り替えるサンプルソースを下記に示します。
Form1 の上に textBox1、textBox2、textBox3、button1 を配置します。
Form1 に Form1_Load イベントハンドラを定義します。
Form1 に Form1_Paint イベントハンドラを定義します。
button1 に button1_Click イベントハンドラを定義します。
textBox2 や textBox3 の値を色々変更して試してみてください。理解が深まると思います。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace aaa
{
public partial class Form1 : Form
{
int GlobalValue = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e )
{
textBox1.ReadOnly = true;
textBox1.Text = GlobalValue.ToString();
textBox2.Text = "1";
textBox3.Text = "1";
}
private void Form1_Paint( object sender, PaintEventArgs e )
{
textBox1.Text = GlobalValue.ToString();
if ( GlobalValue != 0 )
{
// ノンゼロのときはアクア色にする.
this.BackColor = Color.Aqua;
}
else
{
// ゼロのときはデフォルト色にする.
this.BackColor = SystemColors.Control;
}
}
private void button1_Click( object sender, EventArgs e )
{
int value_rep = int.Parse( textBox2.Text );
int value_cmp = int.Parse( textBox3.Text );
// 疑似コードをコールする.
int ret = MyCompareExchange( ref GlobalValue, value_rep, value_cmp );
// 戻り値をタイトルバーに表示する.
this.Text = String.Format( "ret is {1}", GlobalValue, ret );
// 再描画を要求する.
this.Invalidate();
}
// Interlocked.CompareExchange の疑似コード.
public int MyCompareExchange(
ref int TheValue,
int replace_value_when_TheValue_epuals_value_compare,
int value_compare
)
{
int tmp = TheValue;
if ( tmp == value_compare )
{
// 同じ値だったら更新する.
TheValue = replace_value_when_TheValue_epuals_value_compare;
}
return tmp;
}
}
}