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;

		}
	}
}