Interlocked.Increment 某数区间法
Interlocked.Increment Method by a Certain Number Interval
我们有一个并发的多线程程序。
我如何使样本数每次增加 +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);
}
这是另一个基于它的问题,
我想你想要 Interlocked.Add
:
Adds two integers and replaces the first integer with the sum, as an atomic operation.
int num = 0;
Interlocked.Add(ref num, 5);
Console.WriteLine(num);
添加(即 +=
)不是也不可能是原子操作(如您所知)。不幸的是,如果不强制执行完整的围栏,就无法实现这一目标,从好的方面来说,这些都在低水平上进行了相当优化。但是,还有其他几种方法可以确保完整性(特别是因为这只是一个添加)
- 使用
Interlocked.Add
(最明智的解决方案)
- 在 for 循环外应用独占
lock
(或 Moniter.Enter
)。
AutoResetEvent
以确保线程一个接一个地执行任务(meh sigh)。
- 在每个线程中创建一个临时文件
int
,完成后将临时文件添加到独占锁或类似锁下的总和中。
- 使用
ReaderWriterLockSlim
.
Parallel.For
基于线程的累积与 Interlocked.Increment
总和,与 4. 相同
我们有一个并发的多线程程序。 我如何使样本数每次增加 +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);
}
这是另一个基于它的问题,
我想你想要 Interlocked.Add
:
Adds two integers and replaces the first integer with the sum, as an atomic operation.
int num = 0;
Interlocked.Add(ref num, 5);
Console.WriteLine(num);
添加(即 +=
)不是也不可能是原子操作(如您所知)。不幸的是,如果不强制执行完整的围栏,就无法实现这一目标,从好的方面来说,这些都在低水平上进行了相当优化。但是,还有其他几种方法可以确保完整性(特别是因为这只是一个添加)
- 使用
Interlocked.Add
(最明智的解决方案) - 在 for 循环外应用独占
lock
(或Moniter.Enter
)。 AutoResetEvent
以确保线程一个接一个地执行任务(meh sigh)。- 在每个线程中创建一个临时文件
int
,完成后将临时文件添加到独占锁或类似锁下的总和中。 - 使用
ReaderWriterLockSlim
. Parallel.For
基于线程的累积与Interlocked.Increment
总和,与 4. 相同