为什么不让你的参数成为类的一部分,使它们成为属性,并让 get/set 方法锁定它们呢?如果你有足够的参数,让参数对象本身成为对象的属性,然后锁定那个参数块。如:
class GonnaDoSomeThreading {
private Object mBlockLock = new Object();
private MyParameterBlock mBlock;
public MyParameterBlock Block {
get {
MyParameterBlock tmp;
lock (mBlockLock){
tmp = new MyParameterBlock(mBlock); //or some other cloning
}
return tmp; //use a tmp in order to make sure that modifications done
//do not modify the block directly, but that modifications must
//be 'committed' through the set function
}
set { lock (mBlockLock){ mBlock = value; } }
}
}
然后按照已经建议的那样做你的线程池。这样一来,你就有了数据访问的锁,所以如果你的所有线程都需要它,它们可以互相等待。
如果您这样做是为了图像处理(可以同时完成许多并行对象),那么最好将数据分解成个性化的块。IE,假设你想在一个较大的图像上运行一些卷积,所以想把它分成两半。然后,您可以使用“Fragmentimage”函数创建您要单独处理的图像块,然后调用“MergeFragments”函数来连接所有结果。所以你的片段可能看起来像:
class ThreadWorkFragment {
<image type, like ushort>[] mDataArray;
bool mDone;
}
在该片段周围加一个锁(即,对象和片段的列表,每个对象和片段都有一个锁等等),这样当线程访问它的片段时,它最终可以声明它已经“完成”,释放锁,然后然后你可以有一个最终的合并函数,它只是等待那些完成的布尔值被标记。这样,如果其中一个线程在设置完成之前就死了,并且您知道该线程已经死了,那么您也知道该线程没有完成它的工作,您需要进行一些错误恢复;如果你只是等待连接发生,线程可能仍然会弄乱它的片段。
但是,根据您要解决的问题,有很多特定的想法需要实施。