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类,但仅此而已。
假设您有一个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));