首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何使用Interlocked.CompareExchange

C#如何使用Interlocked.CompareExchange
EN

Stack Overflow用户
提问于 2011-09-29 17:46:54
回答 1查看 1.4K关注 0票数 1

我的目标是:

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

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

代码语言:javascript
复制
for (int t = 0; t < threads; t++)
{
  Thread thr = new Thread(new ThreadStart(startThread));
}

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

你能在路上帮我吗?我知道我必须使用互锁类,但这都是…。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-29 17:52:12

假设你在某个地方有一个int字段(最初初始化为-1 ),那么:

代码语言:javascript
复制
int newVal = Interlocked.Increment(ref theField);

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

代码语言:javascript
复制
int next;
while((next = Interlocked.Increment(ref theField)) <= upperInclusive) {
   // do item with index "next"
}

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

代码语言:javascript
复制
Parallel.For(lowerInclusive, upperExclusive, i => DoWork(i));

或者(限制为12个线程):

代码语言:javascript
复制
var options = new ParallelOptions { MaxDegreeOfParallelism  = 12 };
Parallel.For(lowerInclusive, upperExclusive, options, i => DoWork(i));
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7595460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档