我有两个线程,t1 和 t2。
它们都对名为"count"的全局变量进行添加操作,该变量以 0 初始化。
T1 count++
,T2 count+=100
。我先开始 t1,然后开始 t2,但输出结果不符合我的期望。是不是我误会了什么?
即使我在两个线程中使用了 lock((,也无济于事。
下面是 C# 代码:
private int count = 0;
private object locker = new object();
void run()
{
var t1 = new Thread(Add_1);
var t2 = new Thread(Add_2);
t1.Start();
t2.Start();
}
void Add_1()
{
lock(locker)
{
count++;
Console.WriteLine(count);
}
}
void Add_2()
{
lock(locker)
{
count += 100;
Console.WriteLine(count);
}
}
它有时会打印
1 101
或
100
101
我对此一无所知。在我看来,t1 应该有储物柜,直到它完成工作。但似乎 t2 有机会在 t1 之前添加计数。
希望有人能帮我一把,谢谢。
怎么了?实际上,您在代码中定义或启动的顺序不会告诉计算机如何执行。事实上,您有两个完全独立的线程,您的 VM/处理器可以按任意顺序执行它。锁不会告诉它正确的执行顺序是什么,而只是告诉它一个线程在,其他线程必须等待。
因此,您的程序运行良好。如果你想按顺序执行它,你不需要线程,或者你可以使用任何 async/await 方法来同步它们,或者你可以让一个线程进入睡眠状态。
也许,你想看看这些文章
- https://www.tutorialspoint.com/csharp/csharp_multithreading.htm
- https://www.codeproject.com/Articles/26130/Threads-and-Thread-Synchronization-in-C
- http://www.albahari.com/threading/
- https://www.codingame.com/playgrounds/4240/your-ultimate-async-await-tutorial-in-c/introduction