【发布时间】:2013-01-08 18:53:35
【问题描述】:
在这个例子中,如果我想一次将可以执行函数DoWork 的线程数限制为十个,那么这是正确使用Parallel.For 循环吗?是否会阻塞其他线程,直到十个线程之一可用?如果不是,有什么更好的多线程解决方案仍然可以让我执行该功能 6000 多次?
class Program
{
static void Main(string[] args)
{
ThreadExample ex = new ThreadExample();
}
}
public class ThreadExample
{
int limit = 6411;
public ThreadExample()
{
Console.WriteLine("Starting threads...");
int temp = 0;
Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
DoWork(temp);
temp++;
});
}
public void DoWork(int info)
{
//Thread.Sleep(50); //doing some work here.
int num = info * 5;
Console.WriteLine("Thread: {0} Result: {1}", info.ToString(), num.ToString());
}
}
【问题讨论】:
-
temp++不是线程安全的。 -
@SLaks 是的,它不是线程安全的,但它在这场比赛中有意义吗? Parallel.For 是如何工作的?
-
@HamletHakobyan 你是什么意思?程序员的意图很明确;他想计算已完成任务的数量。实际发生的情况并不相同,因为竞争条件可能会导致计数器未正确递增。使用
interlocked.Exchange可以解决这个问题。至于Paralle.For,它是一个for循环,其迭代由多个线程(在一定程度上)并行执行。 -
@Servy 你有错字
Interlocked.Increment必须是。但也不是必需的,如Mattias Buelens中所述,答案循环计数器是内部组织的,temp在这种情况下并不实际。
标签: c# multithreading