Почему бы вашим параметрам не быть частью класса, не задать им свойства и не заблокировать методы 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;
}
Установите блокировку вокруг этого фрагмента (т. Е. Список объектов и фрагментов, каждый из которых имеет блокировку и т. Д.), Чтобы, когда поток получил доступ к своему фрагменту, он мог в конечном итоге заявить, что он «готов», освободить блокировка, и тогда у вас может быть функция окончательного слияния, которая просто ожидает, чтобы эти готовые логические значения были отмечены. Таким образом, если один из потоков умирает до завершения установки, и вы знаете, что поток мертв, то вы также знаете, что поток не завершил свою работу, и вам необходимо выполнить восстановление после ошибки; если вы просто ждете, когда произойдет соединение, поток все равно мог испортить свой фрагмент.
Но есть много таких конкретных идей для реализации, основанных на проблеме, которую вы пытаетесь решить.