是否可以在Parallel.For循环中使用相同的函数委托,或者我是否在死锁中运行。
这意味着我想做这样的事情:
public Execute(float[] input, Func<float, int, bool> WorkOnIt)
{
Parallel.For(0, input.GetLength(0), i =>
{
if(WorkOnit(input, i)
...
...
});
}
非常感谢!
答案 0 :(得分:0)
您可以使用相同的功能,但请注意,如果您需要使用在功能范围之外声明的数据,则需要确保这些数据类型的线程安全,例如:使用锁定。
http://msdn.microsoft.com/de-de/library/system.threading.tasks.parallel(v=vs.110).aspx
编辑:所以当然你可以通过使用并行任务来生成死锁,如果你想到这样的smtg:
void myfunction(...) {
lock (locker) {
doSomethingWithAGlobalList(..);
waitForOtherTasksDoingThingsWithThatList(..);
}
}
但这不是你的Parallel.For的问题,而是由任何并发线程进入myfunction引起的
答案 1 :(得分:0)
这取决于WorkOnIt
的详细信息。您是否对外部可见对象使用任何同步方法,您必须小心。如果没有那么你是安全的。
例如,如果您的WorkOnIt
看起来像:
private void MyWorkOnIt(float[] input, int idx)
{
lock(input) { /* ... */ } // possible deadlock scenario
}
如果调用Execute
的代码锁定在同一个对象上,这可能会死锁:
lock(myInput)
{
Execute(myInput, MyWorkOnIt);
}
一般情况下,我会尝试使并行循环的委托完全独立于任何共享状态。如果我做不到 - 例如当我必须聚合项目时 - 然后我将使用其中一个使用本地状态的并行循环。