C#如何使用Interlocked.CompareExchange

Ini*_*igo 1 c# multithreading interlocked locks

我的目标是:

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

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

for (int t = 0; t < threads; t++)
{
  Thread thr = new Thread(new ThreadStart(startThread));
}
Run Code Online (Sandbox Code Playgroud)

startThread() 是我用于计算的方法.

你能帮帮我吗?我知道我必须使用Interlocked类,但这就是......

Mar*_*ell 6

假设你有一个int字段(-1最初初始化)然后:

int newVal = Interlocked.Increment(ref theField);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Parallel.For(lowerInclusive, upperExclusive, i => DoWork(i));
Run Code Online (Sandbox Code Playgroud)

或(约束为12个线程):

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