Interlocked.Increment方法的一定数量间隔

问题描述 投票:2回答:2

我们有一个并发的多线程程序。如何使样本数每次增加+5个间隔? Interlocked.Increment,是否有间隔超载?我没有看到它列出。

Microsoft Interlocked.Increment Method

// Attempt to make it increase by 5

private int NumberTest;

for (int i = 1; i <= 5; i++)
{
    NumberTest= Interlocked.Increment(ref NumberTest);
}

这是另一个基于它的问题,

C# Creating global number which increase by 1

c# .net-core .net-core-2.0
2个回答
6
投票

我想你想要Interlocked.Add

添加两个整数并将第一个整数替换为sum,作为原子操作。

int num = 0;
Interlocked.Add(ref num, 5);
Console.WriteLine(num);

1
投票

添加(即+=)不是也不能是原子操作(如您所知)。不幸的是,如果没有强制执行完整的围栏,就没有办法实现这一目标,从好的方面来看,这些都是在较低的水平上进行了相当优化。但是,有几种方法可以确保完整性(特别是因为这只是一个添加)

  1. 使用Interlocked.Add(最安静的解决方案)
  2. 在for循环之外应用独有的lock(或Moniter.Enter)。
  3. AutoResetEvent确保线程逐个完成任务(meh叹气)。
  4. 在每个线程中创建一个临时int,并在完成时将temp添加到独占锁或类似项下的总和上。
  5. 使用ReaderWriterLockSlim
  6. Parallel.For基于线程积累与Interlocked.Increment总和,与4相同。
© www.soinside.com 2019 - 2024. All rights reserved.