我可能在这里遗漏了一些基本的东西,但仍然希望您能帮助理解这一点。因此,我编写了以下简单的多线程程序:
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 问题发布技巧不佳而导致格式错误):
Hello Thread 1,mSum 值:62 再见 Thread 1,mSum 值:63 Hello Thread 1,mSum 值:63 再见 Thread 1,mSum 值:64 你好线程 2,mSum 值:59 再见线程 2,mSum 值:65 你好线程 2,mSum 值:65 再见线程 2,mSum 值:66
所以,假设我写得对,并且 mSum 确实在线程之间共享(看起来像......) - 我该如何解释第 1 行。3? 线程 2 读取 59,加 1,然后我们得到 65!
我发现了一种新的数学吗?:)