ここには基本的なものが欠けている可能性がありますが、これを理解するために親切な助けをいただければ幸いです。だから私は私が書いた次の単純なマルチスレッドプログラムを持っています:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
// List<int> outcome = new List<int>();
Test t = new Test();
Thread thread1 = new Thread(new ThreadStart(t.call1));
Thread thread2 = new Thread(new ThreadStart(t.call2));
thread1.Start();
thread2.Start();
Thread.Sleep(3000); //Give enough time for threads to end
Console.Write("{0},", t.mSum);
t.mSum = 0;
}
}
class Test
{
public int mSum = 0;
public void call1()
{
//lock (this)
//{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Hello Thread 1, mSum value: {0}", mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 1, mSum value: {0}", mSum);
}
//}
// Console.WriteLine(mSum);
}
public void call2()
{
for (int i = 0; i < 100 ; i++)
{
Console.WriteLine("Hello Thread 2, mSum value: {0}",mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 2, mSum value: {0}",mSum);
}
}
}
}
コンテキストの切り替えはいつでも発生する可能性があるため、この出力は非決定論的であると予想されますか? しかし、プログラムを実行すると、次の出力が得られます (stackoverflow.com の質問投稿スキルが不十分なため、出力の一部のみが不正です)。
こんにちはスレッド 1、mSum 値: 62 さようならスレッド 1、mSum 値: 63 こんにちはスレッド 1、mSum 値: 63 さようならスレッド 1、mSum 値: 64 こんにちはスレッド 2、mSum 値: 59 さようならスレッド 2、mSum 値: 65 こんにちはスレッド 2、mSum 値: 65 さようならスレッド 2、mSum 値: 66
したがって、私がこれを正しく書いたと仮定すると、mSum は実際にスレッド間で共有されます (そのように見えます...) - 行番号をどのように説明できますか? 3? スレッド 2 は 59 を読み取り、1 を加算すると 65 になります!
新しい種類の数学を発見しましたか? :)