c# - 为什么我用这个不同步的代码反复得到相同的结果?

标签 c# .net multithreading

考虑一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Multithreading
{
    class Program
    {
        static int result = 0;

        static void changeResult1()
        {
            result = 1;
        }

        static void changeResult2()
        {
            result = 2;
        }

        static void changeResult3()
        {
            result = 3;
        }

        static void Main(string[] args)
        {

            Thread t1 = new Thread(new ThreadStart(changeResult1));
            Thread t2 = new Thread(new ThreadStart(changeResult2));
            Thread t3 = new Thread(new ThreadStart(changeResult3));


            t1.Start();
            t2.Start();
            t3.Start();
            Console.WriteLine(result);
        }
    }
}

我很确定这段代码不是同步的,这意味着每次执行代码 (0,1,2,3) 时 result 应该是不同的。在我看来,如果主线程在任一线程启动之前完成,结果甚至可以是 0

但是我在屏幕上反复得到 2 作为结果。

为什么?

最佳答案

Is this code correctly synchronized ?

没有。

meaning that result should be different each execution of the code (0,1,2,3) .

为什么那是真的?您没有为此声明提供任何理由。

代码同步不正确,这意味着有很多可能的结果。你正在接受一个事实——缺乏正确的同步意味着我不知道会发生什么——并从中推断出一个完全不受支持的结论——每个人的观察结果都会不同执行。 “我不知道会发生什么”的正确推论是您不知道任何执行时会发生什么;特别是您不知道大量运行的行为将具有任何特定分布。

Why ?

为什么?您注意到 2 是一个可能的结果,您正在得到一个可能的结果。你做同样的事情两次,结果是一样的;这并不奇怪。仅仅因为允许运行时产生许多不同的结果并不意味着它必须产生许多不同的结果。做同样的事情两次通常会产生非常相似的结果。

关于c# - 为什么我用这个不同步的代码反复得到相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33580350/

相关文章:

c# - 尝试获取 ICacheManager 类型的实例时发生激活错误, key "Cache Manager"

c# - 下拉绑定(bind)方法不起作用

c# - 尝试发送电子邮件时如何捕获/报告 elmah 命中的错误?

c# - 如果对象被垃圾收集,如何得到通知?

c# - .NET Framework 中是否有 API 或类可以像 Windows 讲述人那样检测您在桌面上执行的操作?

c# - 如何顺序访问每个线程中的列表元素

c - libxml2.so Init/CleanupParser 用于带线程的多进程

c# - 在 C# 中获取线程的内存统计信息

c# - 在单个 foreach C# 中迭代​​ 2 个形状列表

c# - 锁会阻止错误 "The process cannot access the file because it is being used by another process"吗?