Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两次测试运行之间的差异)。也就是说,您的肯定结果Output:Counter:1000000使人们希望它能在一般情况下工作,但在那里它对证明没有任何帮助。我们需要一个系统的论证,我的答案中包含了对程序正确性的解释。我试图提供一个高层次的、直观的解释,而不是_C#_.net_Asynchronous_Concurrency - Fatal编程技术网

C# 两次测试运行之间的差异)。也就是说,您的肯定结果Output:Counter:1000000使人们希望它能在一般情况下工作,但在那里它对证明没有任何帮助。我们需要一个系统的论证,我的答案中包含了对程序正确性的解释。我试图提供一个高层次的、直观的解释,而不是

C# 两次测试运行之间的差异)。也就是说,您的肯定结果Output:Counter:1000000使人们希望它能在一般情况下工作,但在那里它对证明没有任何帮助。我们需要一个系统的论证,我的答案中包含了对程序正确性的解释。我试图提供一个高层次的、直观的解释,而不是,c#,.net,asynchronous,concurrency,C#,.net,Asynchronous,Concurrency,两次测试运行之间的差异)。也就是说,您的肯定结果Output:Counter:1000000使人们希望它能在一般情况下工作,但在那里它对证明没有任何帮助。我们需要一个系统的论证,我的答案中包含了对程序正确性的解释。我试图提供一个高层次的、直观的解释,而不是基于C#规范引用的严格解释(因为1.生命太短,2.我的名字不是Jon Skeet)。您是对的,尽管程序的正确性不是由单个执行的正确性来证明的。在1000个不同的计算机系统中,每一个系统都有1000000次正确的执行,这甚至不能被证明。我不是在责


两次测试运行之间的差异)。也就是说,您的肯定结果
Output:Counter:1000000
使人们希望它能在一般情况下工作,但在那里它对证明没有任何帮助。我们需要一个系统的论证,我的答案中包含了对程序正确性的解释。我试图提供一个高层次的、直观的解释,而不是基于C#规范引用的严格解释(因为1.生命太短,2.我的名字不是Jon Skeet)。您是对的,尽管程序的正确性不是由单个执行的正确性来证明的。在1000个不同的计算机系统中,每一个系统都有1000000次正确的执行,这甚至不能被证明。我不是在责怪你没有提供完整的证据(出于你提到的原因,我同意)。然而,我看到在集成系统中并发程序失败,总体结果不稳定,这是由于在系统的一个小组件上进行测试时无法检测到的详细并发问题。因此,我个人对有用的并发性证明设计的看法是非常严格的(而且,我承认,有点狭隘)。@HelpingHand如果你的任务是证明上述程序是正确的,你会怎么做?我必须检查schedular的规范和程序使用的不同API(我同意,做了很多工作!). 关键是,并发行为严重依赖于统计事件(某些数据访问是否及时受到干扰)。因此,我们不能基于物理参数(大量测试)来声明此类错误的自由度,而只能基于数学参数。在讨论并发问题时,仅运行一次并发系统而不检测到错误是不够的(至少在涉及可能包含两次测试运行之间不同的任意抖动的真实系统时不是这样)也就是说,你的肯定结果
输出:Counter:1000000
给了我们希望,它可以在一般情况下工作,但它对证明没有任何帮助。我们需要一个系统的论证。@helping并且我的答案中包含了对程序正确性的解释。相反,我试图提供一个高层次、直观的解释根据C#规范的引用,d是严格的(因为1.生命太短,2.我的名字不是Jon Skeet).你是对的,但程序的正确性并不是由一次执行的正确性来证明的。在1000个不同的计算机系统中,它甚至不能被证明是1000000次正确执行。我不是因为你没有提供完整的证明而责备你(出于你提到的原因,我同意).然而,我在集成系统中看到并发程序失败,总体结果不稳定,这是由于在系统的一个小组件上进行测试时无法检测到的细节并发问题。因此,我个人对有用的并发验证设计的看法非常严格(我承认,有点狭隘).@HelpingHand如果你的任务是证明上述程序是正确的,你会怎么做?我将不得不检查调度程序的规范以及程序使用的不同API(我同意,这是相当多的工作!)。问题是,并发行为在很大程度上取决于统计事件(一些数据访问是否及时受到干扰)。因此,我们不能基于物理参数(大量测试)来说明此类错误的自由度,而只能基于数学参数。
 Run Task 1: Lock mutex, do some work

 Pause Task 1

 Run Task 2: Lock mutex, do some work, release mutex

 Run Task 1: keep doing work, release mutex
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
    public static void Main()
    {
        const int TASKS_COUNT = 1000;
        const int LOOPS_COUNT = 1000;
        ThreadPool.SetMinThreads(100, 10); // Ensure that we have more threads than cores
        var locker = new object();
        var counter = 0;
        var tasks = Enumerable.Range(1, TASKS_COUNT).Select(async x =>
        {
            for (int i = 0; i < LOOPS_COUNT; i++)
            {
                await Task.Yield();
                lock (locker)
                {
                    counter++;
                }
            }
        }).ToArray();
        Task.WaitAll(tasks);
        Console.WriteLine($"Counter: {counter:#,0}");
    }
}