我可以在Parallel.For循环中使用相同的函数委托

时间:2014-09-16 07:54:51

标签: c# multithreading member-function-pointers parallel.for

是否可以在Parallel.For循环中使用相同的函数委托,或者我是否在死锁中运行。

这意味着我想做这样的事情:

    public Execute(float[] input, Func<float, int, bool> WorkOnIt)
    {
        Parallel.For(0, input.GetLength(0), i =>
        {
            if(WorkOnit(input, i)
               ...
            ...
         });
    }

非常感谢!

2 个答案:

答案 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);
}

一般情况下,我会尝试使并行循环的委托完全独立于任何共享状态。如果我做不到 - 例如当我必须聚合项目时 - 然后我将使用其中一个使用本地状态的并行循环。