c#如何使用interlocking . compareexchange

本文关键字:compareexchange interlocking 何使用 | 更新日期: 2023-09-27 18:09:57

我的目标如下:

有一定范围的整数,我必须测试该范围内的每个整数是否有随机值。我想为此使用多个线程,并使用共享计数器在线程之间平均分配工作。我将计数器设置为初始值,并让每个线程获取一个数字,增加它,进行一些计算,并返回结果。这个共享计数器必须加锁,否则在要测试的整数范围内会有间隙/重叠。

我不知道从哪里开始。假设我想要12个线程来完成这项工作,我这样做:

for (int t = 0; t < threads; t++)
{
  Thread thr = new Thread(new ThreadStart(startThread));
}

startThread()是我用来计算的方法。

你能帮我一下吗?我知道我必须使用Interlocked类,但仅此而已。

c#如何使用interlocking . compareexchange

假设您有一个int字段(初始化为-1),然后:

int newVal = Interlocked.Increment(ref theField);

是一个线程安全的增量;假设您不介意(非常小的)超出int上限的风险,那么:

int next;
while((next = Interlocked.Increment(ref theField)) <= upperInclusive) {
   // do item with index "next"
}

然而,Parallel.For将更方便地完成所有这些:

Parallel.For(lowerInclusive, upperExclusive, i => DoWork(i));

或(限制为12个线程):

var options = new ParallelOptions { MaxDegreeOfParallelism  = 12 };
Parallel.For(lowerInclusive, upperExclusive, options, i => DoWork(i));