C# 我可以在并行For循环中使用相同的函数委托吗

C# 我可以在并行For循环中使用相同的函数委托吗,c#,multithreading,member-function-pointers,parallel.for,C#,Multithreading,Member Function Pointers,Parallel.for,是否可以在并行.For循环中使用相同的函数委托,还是在死锁中运行 这意味着我想做这样的事情: public Execute(float[] input, Func<float, int, bool> WorkOnIt) { Parallel.For(0, input.GetLength(0), i => { if(WorkOnit(input, i) ...

是否可以在并行.For循环中使用相同的函数委托,还是在死锁中运行

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

    public Execute(float[] input, Func<float, int, bool> WorkOnIt)
    {
        Parallel.For(0, input.GetLength(0), i =>
        {
            if(WorkOnit(input, i)
               ...
            ...
         });
    }
void myfunction(...) {
   lock (locker) {
       doSomethingWithAGlobalList(..);
       waitForOtherTasksDoingThingsWithThatList(..);
   }
}
public执行(float[]输入,Func workunit)
{
Parallel.For(0,input.GetLength(0),i=>
{
if(工作单位(输入,i)
...
...
});
}

非常感谢!

您可以使用相同的函数,但请注意,如果需要使用函数范围之外声明的数据,则需要确保这些数据类型的线程安全,例如使用锁定

编辑:当然,如果您认为smtg是这样的,那么您可以通过使用并行任务生成死锁:

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

但这与您的并行性无关。对于任何进入myfunction的并发线程,这取决于
worknit
的详细信息,并且可能是由这些线程引起的。您是否对外部可见的对象使用了任何同步方法,您必须小心。如果没有,则您是安全的

例如,如果您的
worknit
看起来像:

private void MyWorkOnIt(float[] input, int idx)
{
    lock(input) { /* ... */ } // possible deadlock scenario
}
如果调用
Execute
的代码锁定同一对象,则可能会死锁:

lock(myInput)
{
    Execute(myInput, MyWorkOnIt);
}

一般来说,我会尝试使并行循环的委托完全独立于任何共享状态。如果我做不到(例如,当我必须聚合项时),那么我将使用一个使用本地状态的并行循环。

非常感谢您的帮助!!我只是从数组中读取,所以您是对的,这不会给我带来死锁。我很抱歉我对代理不太熟悉,所以我担心在多线程中这可能会产生干扰。但现在它似乎工作正常。非常感谢您的帮助!您完全正确,这只会像您的示例中那样出现死锁。我对代理不太熟悉,所以我担心在多线程中这可能会产生干扰.但它似乎很管用。