1

Est-il possible d'utiliser le même délégué de fonction dans une boucle Parallel.For ou de lancer un blocage?Puis-je utiliser le même délégué de fonction dans une boucle Parallel.For

Cela signifie que je voudrais faire quelque chose comme ceci:

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

Merci beaucoup!

Répondre

0

Vous pouvez utiliser la même fonction, mais sachez que si vous devez utiliser des données déclarées en dehors de la portée de la fonction, vous devrez assurer la sécurité des threads pour ces types de données, par ex. utiliser le verrouillage.

http://msdn.microsoft.com/de-de/library/system.threading.tasks.parallel(v=vs.110).aspx

Edit: si bien sûr vous pouvez générer un blocage en utilisant des tâches parallèles, si vous pensez smtg comme ceci:

void myfunction(...) { 
    lock (locker) { 
     doSomethingWithAGlobalList(..); 
     waitForOtherTasksDoingThingsWithThatList(..); 
    } 
} 

Mais ce n'est pas une question de votre Parallel.For et serait provoqué par tous les threads concurrents entrant dans ma fonction

+0

Merci beaucoup pour votre aide! Vous avez absolument raison, cela ne devrait donner qu'une impasse comme dans votre exemple. Je ne suis pas très familier avec les délégués, donc j'étais inquiet que dans le multi-threading cela puisse interférer d'une manière ou d'une autre. Mais cela semble fonctionner correctement. – Dirk

0

Cela dépend des détails de WorkOnIt. Utilisez-vous des moyens de synchronisation pour les objets visibles de l'extérieur que vous devez faire attention. Sinon, vous êtes en sécurité.

Par exemple, si votre WorkOnIt ressemble:

private void MyWorkOnIt(float[] input, int idx) 
{ 
    lock(input) { /* ... */ } // possible deadlock scenario 
} 

Cela pourrait se bloquer si le code qui appelle Execute verrous sur le même objet:

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

En général, j'essayer de faire les délégués de boucles parallèles complètement indépendant de tout état partagé. Si je ne peux pas faire - par exemple. quand je dois agréger des objets - alors je vais utiliser l'une des boucles parallèles qui utilisent un état local.

+0

Merci beaucoup pour votre aide !! Je ne fais que lire à partir du tableau, donc vous avez raison, cela ne devrait pas me donner une impasse. Je ne suis pas très familier avec les délégués, donc j'étais inquiet que dans le multi-threading cela puisse interférer d'une manière ou d'une autre. Mais cela semble fonctionner correctement maintenant. – Dirk

Questions connexes