2 votes

Comment stocker les résultats des tâches exécutées dans le pool de threads ?

J'ai un problème avec l'efficacité d'un threadpool. Je ne suis pas sûr de comprendre le concept dans son ensemble. J'ai beaucoup lu avant de poser cette question et je sais que le threadpool est une bonne solution si vous avez beaucoup de petites tâches relativement rapides à exécuter. fonctions Et, ce qui est plus important, des tâches non bloquantes. Utilisation de lock est très mauvais dans le threadpool.

Et voici ma question : Comment retourner les valeurs du threadpool fonctions ? Si vous avez fonctions pour fonctionner, ils doivent probablement produire des résultats, non ? Il est bon de stocker ces résultats quelque part. Où ?

Je suis en train de courir vers les 200 000 dollars très rapidement. fonctions dans un pool de threads. Les résultats que je stocke dans le List . Bien sûr, je dois le faire :

lock(lockobj)
{
    myList.Add(result);
}

Alors, est-ce que c'est la bonne méthode ? Je veux dire, si votre fonctions retourne QUELQUE CHOSE, vous devez les stocker dans une sorte de collection. Il faut que ce soit une collection bloquante. Donc, j'ai commencé à penser... "Le blocage est très perlé dans le threadpool, mais vous devez le faire, au moins une fois - à la fin de chaque fonction.

Comment stocker/renvoyer les résultats de fonctions fonctionnant dans le pool de threads ?

Merci ! JB

EDIT : Par "fonction" Je veux dire...

 ThreadPool.QueueUserWorkItem(state =>
 {
    Result r = function(); // previously named "Task"
    lock(lockobj)
    {
        allResults.Add(r);
    }
 }

1voto

Zer0 Points 3390

Si vous ne voulez pas bloquer le ThreadPool Les threads utilisent une approche sans verrou. ConcurrentQueue est actuellement libre de tout verrou (à partir de .NET 4.6.2) lorsque vous mettez des éléments en file d'attente.

Alors faites simplement ceci :

public static ConcurrentQueue<Result> AllResults { get; } = new ConcurrentQueue<Result>();

ThreadPool.QueueUserWorkItem(state =>
{
    Result r = function();
    AllResults.Enqueue(r);
}

Cela vous garantira de ne pas bloquer ThreadPool des fils.

0voto

Tout type de collection qui est thread safe/synchronisée fera l'affaire. . Il y en a beaucoup dans .net framework.

Vous pouvez également utiliser volatile des variables pour stocker des données entre plusieurs threads - mais cela est généralement considéré comme une mauvaise pratique .

Une autre approche peut être de planifier ces opérations sur des tâches qui peuvent produire des résultats, elles sont exécutées par défaut sur le pool de threads et vous pouvez obtenir les valeurs de retour en attendant les méthodes et en vérifiant le résultat de la tâche qui est retournée.

Enfin, vous pouvez écrire votre propre code afin de synchroniser l'accès à certaines régions du code/variables etc. en utilisant des trucs comme verrou, sémaphores, mutex, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X