我在“任务”中使用了“锁”它不起作用并且发生了竞争条件
我定义了一个 Counter,它最终应该返回 0,因为 Method 会增加 Counter 的值,而 Method 会减少它。
当我使用Thread时这不是问题。当我使用Task时出现这个问题
我使用lock和monitor但它没有再次工作并给出与之前相同的结果
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");
}
}
}