gpt4 book ai didi

c# - 互锁类 : read before write race condition problem

转载 作者:行者123 更新时间:2023-12-03 07:51:33 24 4
gpt4 key购买 nike

using System;
using System.Threading;
using System.Threading.Tasks;

namespace InterlockedLearning
{
class Program
{
static int sharedVariable = 0;

static void Main()
{
Parallel.For(0, 1000000, Func1);
Console.WriteLine("Thread{0} sharedVariable: {1}", Thread.CurrentThread.ManagedThreadId, sharedVariable);
Console.Read();
}

public static void Func1(int val)
{
int i = Interlocked.CompareExchange(ref sharedVariable, 0, 0);
if (i < 500000)
{
Interlocked.Increment(ref sharedVariable);
}
}
}

我正在研究如何修改上面的代码,以便竞争条件问题不再发生。

上面的代码结果应该是500000,但是如果运行多次,代码最终的结果是500001。我认为可能是检查条件造成的。

我知道简单地使用锁就可以解决这个问题,但我想知道是否有任何非阻塞风格的方法可以解决这个问题。

最佳答案

使用 CompareExchange 更新字段的一般模式 is (from MSDN) :

int initialValue, computedValue;
do {
// Save the current running total in a local variable.
initialValue = totalValue;

// Add the new value to the running total.
computedValue = initialValue + addend;

// CompareExchange compares totalValue to initialValue. If
// they are not equal, then another thread has updated the
// running total since this loop started. CompareExchange
// does not update totalValue. CompareExchange returns the
// contents of totalValue, which do not equal initialValue,
// so the loop executes again.
} while (initialValue != Interlocked.CompareExchange(ref totalValue, computedValue, initialValue));

根据您的场景进行调整:

int initialValue, computedValue;
do
{
initialValue = sharedVariable;
if (initialValue >= 500000)
{
break;
}
computedValue = initialValue + 1;
} while (initialValue != Interlocked.CompareExchange(ref sharedVariable, computedValue, initialValue));

这说:

  • 读取字段的当前值。
  • 如果当前值 >= 500000,我们就完成了。
  • 加 1 计算新值
  • 如果该字段自读取以来未发生更改,请将其更新为新的计算值。如果 self 们阅读后它发生了变化,则存在一场竞赛,我们需要重试。

有可能发生竞争,我们读取 sharedVariable,然后其他人递增它,然后我们与 500000 进行比较,但这没关系。如果在其他人增加它之前它是 >= 500000,那么在他们增加它之后它也将是 >= 500000。

关于c# - 互锁类 : read before write race condition problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76944241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com