gpt4 book ai didi

c# - C# : How to keep loop-index thread-safe? 中的线程

转载 作者:行者123 更新时间:2023-11-30 19:37:21 25 4
gpt4 key购买 nike

在下面的示例中,for 循环的索引 i 似乎被每个线程独立修改,导致 i 的奇怪值(倍数,偶数大于 System.Environment.ProcessorCount-1) 在 DoWork_Threaded()

如何在 C# 中正确完成多线程循环?

// Prepare all threads
Thread[] threads = new Thread[System.Environment.ProcessorCount];

// Start all threads
for (int i = 0; i < System.Environment.ProcessorCount; i++)
{
threads[i] = new Thread(() => DoWork_Threaded(i));
threads[i].Start();
}

// Wait for completion of all threads
for (int i = 0; i < System.Environment.ProcessorCount; i++)
{
threads[i].Join();
}

最佳答案

首先,与其推出自己的线程调度服务,不如使用任务并行库?它已经具有确定将线程调度到的处理器数量的逻辑。

为了回答您的实际问题,您关闭了一个循环变量。请参阅我的文章,了解为什么这是错误的:

https://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/

简而言之:i 是一个变量 并且变量变化。当您的 lambda 执行时,它会使用 i当前值执行,而不是创建委托(delegate)时它曾经拥有的值。

关于c# - C# : How to keep loop-index thread-safe? 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38308883/

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