gpt4 book ai didi

C# 如何使用 Interlocked.CompareExchange

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:24 25 4
gpt4 key购买 nike

我的目标是:

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

我不知道从哪里开始。假设我想要 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));

关于C# 如何使用 Interlocked.CompareExchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com