c# - 两个线程访问全局变量时的意外结果
问题描述
我有两个线程,t1 和 t2。
它们都对名为“count”的全局变量进行了添加操作,该变量使用 0 初始化。
t1count++
和 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 更早地添加计数。
希望有人能帮帮我,谢谢。
解决方案
怎么了?实际上,您在代码中定义或开始的顺序并不会告诉您的计算机如何执行。事实上,你有两个完全独立的线程,你的虚拟机/处理器可以以任何顺序执行它。锁不会告诉它正确的执行顺序是什么,但只有一个线程在,其他线程必须等待。
因此,您的程序运行良好。如果你想按顺序执行,你不需要线程,或者你可以使用任何 async/await 方法来同步它们,或者你可以让一个休眠。
也许,你想看看这些文章
推荐阅读
- laravel - 需要描述planned_at
- ios - 如何在 Crashlytics Swift 中打印自定义日志记录?
- ios - 架构 arm64 的未定义符号。使用静态库时
- java - JsonSubTypes 在序列化时不换行
- javascript - 比较两个数组并通过对象 id javascript 删除对象
- vb.net - RDLC 报告显示左边 1.5 英寸右边距和 2.5 底部边距
- oracle - 从 sql 文件中获取一个值到调用 sql 文件
- aurelia - 有没有办法将 Ngx-Charts 与 Aurelia 框架一起使用?
- amazon-web-services - 邮递员 [POST] 请求正文未正确解析
- javascript - CKEditor5 文本对齐