【发布时间】:2012-09-08 00:43:39
【问题描述】:
(为简洁起见,以下所有内容均已简化)
我有一个对处理对象的静态引用。
处理器包含一个函数,我可以向它传递一个对象包,这是要处理的信息。
包来自应处理的大量包的列表。这些包是独一无二的;这里没有对同一个对象的多个引用。
我启动了许多线程,以便可以并行处理 toProcess 中的包。线程 Pop() 从 toProcess 堆栈中获取一个可用的 Package,直到堆栈为空。
我现在的问题是:我能否冒着Check 中的package 被另一个线程覆盖的风险,或者另一个线程会“创建”Check 的副本?
static class Program
{
static Processor processor = new Processor();
static Stack<Package> toProcess;
static Object sync = new Object();
static void RunThreads()
{
toProcess = GetPackages();
//start many threads using the Work delegate
}
static void Work()
{
while(true)
{
Package p;
lock(sync)
{
if(toProcess.Count == 0)
break;
p = toProcess.Pop();
}
processor.Check(p);
}
}
}
class Processor
{
public void Check(Package package)
{
//do many analyses on p and report results of p's analysis to elsewhere
}
}
class Package
{
//properties
}
【问题讨论】:
标签: c# multithreading