C# 入門 & 実践 / C sharp

501-1. マルチスレッド:thread を作ってみる。


フォームにボタンをつけクリックするとスレッドを生成し処理を開始する例で見ていきます。

これは必須ですね。
using System.Threading;

スレッドの生成方法は、このようにThreadStart(関数)の形です。
Thread t1 = new Thread(new ThreadStart(counter));
そして、
t1.Start()
で開始します、簡単ですね。

早速例を見ていきましょう。
2つのスレッドから
countを増やして行き
resにメッセージを残して
最後にダイアログで表示すると言うものです。

   public partial class Form1 : Form
    {
        private string res = "";
        private int count = 0;
        private int end_check = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            goThread();
        }

        // ここでテストしてみます。
        private void goThread()
        {
            Thread t1 = new Thread(new ThreadStart(counter));
            t1.Name = "T1";
            Thread t2 = new Thread(new ThreadStart(counter));
            t2.Name = "T2";
            t1.Start();
            t2.Start();
            // 終わるまで待つ。
            t1.Join();
            t2.Join();

            MessageBox.Show(res);


        }
        private void counter()
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(10);
                    count++;
                    res += Thread.CurrentThread.Name + " : " + count + "\n";
                }
            }
        }
    }

まずはシンプルに、

Join()

部分がないとスレッドの終了を待たずにメッセージを出してしまうので、何も表示されません>。<;
Join()を使うことで、t1 と t2が終了してからメッセージ表示を開始することができます。

T1 : 1
T2 : 2
T2 : 3
T1 : 4
T1 : 6
T1 : 7
T2 : 8
T1 : 9
T2 : 10
T1 : 12
T1 : 13
T2 : 14
T2 : 15
T1 : 16

こんな感じで終わります。
残念なことに、数字が抜けていたり・・・20まで数えてくれていません>。<;
そこで lock や Interlocked の登場です。



マルチスレッド同期 » 501-2. lock ロックしてリソースを保護


C# 入門 & 実践 / C sharp