我在“任务不起作用并且发生竞争条件”中使用了“锁定”

问题描述 投票:0回答:1

我在“任务”中使用了“锁”不起作用并且发生了竞争条件

我定义了一个 Counter,它最终应该返回 0,因为 Method 会增加 Counter 的值,而 Method 会减少它。

当我使用Thread时这不是问题。当我使用Task时出现这个问题

我使用

lockmonitor但它没有再次工作并给出与之前相同的结果

namespace ConsoleApp1 { public class LockDemo { private readonly static object _lock = new object(); private static int _count = 0; public void Main() { var tasks = new List<Task>(); for (int i = 0; i < 1000; i++) { tasks.Add(new Task(() => IncrementCounter())); tasks.Add(new Task(() => DecrementCounter())); } foreach (var item in tasks) { item.Start(); } } void IncrementCounter() { Console.WriteLine("wait for opening lock..."); lock (_lock) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("enter the critical section"); _count += 1; Console.WriteLine("Counter:" + _count); Console.ForegroundColor = ConsoleColor.White; } Console.WriteLine("exit critical section"); } void DecrementCounter() { Console.WriteLine("wait for opening lock..."); lock (_lock) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("enter the critical section"); _count -= 1; Console.WriteLine("Counter:" + _count); Console.ForegroundColor = ConsoleColor.White; } Console.WriteLine("exit critical section"); } } }
    
c# asp.net .net task task-parallel-library
1个回答
1
投票
您正在创建 2000 个任务:1,000 个增量和 1,000 个减量。即使您按特定顺序启动任务,也不能保证它们会按该顺序执行,因为它们是异步运行的。有可能发生两次递减,然后一次递增,等等 - 这很可能是您在这里看到的。

另外,不建议使用Task.Start

关于Task.Start()、Task.Run()和Task.Factory.StartNew()的使用

https://devblogs.microsoft.com/pfxteam/task-factory-startnew-vs-new-task-start/

© www.soinside.com 2019 - 2024. All rights reserved.