2010-03-10 7 views
4

J'ai quelques bibliothèques de classes C#, qui ont été conçus sans prendre en compte des choses comme la concurrence, plusieurs threads, serrures, etc ...Les meilleures pratiques pour transformer une bibliothèque de classes .NET dans une bibliothèque de classes .NET multithread

Le code est très bien structuré, il est facilement extensible, mais il peut beaucoup bénéficier du multithreading: c'est un ensemble de bibliothèques scientifiques/d'ingénierie qui doivent effectuer des milliards de calculs en très très peu de temps (et maintenant ils ne profitent pas à partir des noyaux disponibles).

Je veux transformer tout ce code en un ensemble de bibliothèques multithread, mais je ne sais pas par où commencer et je n'ai aucune expérience antérieure.

Je pourrais utiliser toute aide disponible, et toutes les recommandations/suggestions.

Répondre

4

Je recommande fortement de regarder dans .NET 4 et le Task Parallel Library (également disponible dans .NET 3.5sp1 via le cadre Rx).

Cela rend beaucoup de problèmes de simultanéité très simples, en particulier, le parallélisme des données devient dramatiquement plus simple. Puisque vous traitez de grands ensembles de données dans la plupart des bibliothèques scientifiques/d'ingénierie, le parallélisme des données est souvent la solution ...

Pour certains documents de référence, en particulier sur le parallélisme des données et le contexte de la décomposition et de l'approche du problème, vous pourriez veux lire ma série de blog sur Parallelism in .NET 4.

+0

Merci Reed. – ileon

+0

@Reed Copsey: "le parallélisme des données devient radicalement plus simple." Pouvez-vous être plus précis? Je sens que seule l'exécution de tâches parallèles est devenue plus simple ... dites-vous que le parallélisme des données devient plus simple car vous pouvez exécuter des tâches parallèles pour chaque élément de votre collection, à cause de PLINQ ou parce qu'il y a quelque chose qui réduit la contention plus simple? – Kiril

+0

+1. Je n'ai pas encore essayé les 4 tâches/threads, mais j'ai écouté un podcast et beaucoup d'efforts ont été faits pour le rendre plus facile, tant du point de vue des outils/IDE que de l'abstraction de l'API. Je suis impatient de creuser quand j'en ai besoin. @ipapasa, méfiez-vous que la suggestion de Reed est à peu près @John Saunders suggestion. Jouez avant de porter les marchandises. – kenny

8

Ma recommandation serait de ne pas le faire. Vous n'avez pas écrit ce code pour être utilisé en parallèle, donc ça ne marchera pas, et ça va échouer d'une manière qui sera difficile à déboguer. Au lieu de cela, je vous recommande de décider à l'avance quelle partie de ce code peut bénéficier le plus du parallélisme, puis de réécrire ce code, à partir de zéro, pour être parallèle. Vous pouvez utiliser le code non modifié en face de vous et profiter des tests automatisés existants.

Il est possible que l'utilisation du .NET 4.0 Task Parallel Library facilite le travail, mais ne comble pas complètement l'écart entre le code qui n'a pas été conçu pour être parallèle et le code qui l'est.

+0

John, tu me fais peur! Mais encore une fois, vous avez un point là. En disant que le code est bien structuré, j'implique que certaines parties, des algorithmes, pourraient être réécrits à partir de rien peut-être. – ileon

+0

@ipapasa: Je veux te faire peur. J'ai débogué des trucs comme ça, et peut-être que tu ne l'as pas fait. C'est le genre de truc pour te faire des cauchemars. Ce genre de choses est difficile quand vous le concevez à partir de zéro. J'ai vu _operating system_ code visser ça! Sauf tout le respect que je vous dois, mais je ne pense pas que vous fassiez bien. –

+1

@John: J'apprécie ce que vous dites et, pour être honnête, je le prends sérieusement en considération. – ileon

2

Si vous n'avez pas d'expérience antérieure dans multithreading alors je vous recommande d'obtenir les bases d'abord en regardant les différentes ressources: https://stackoverflow.com/questions/540242/book-or-resource-on-c-concurrency

Faire votre multithread toute la bibliothèque nécessite une nouvelle approche architecturale. Si vous faites simplement le tour et commencez à placer des verrous partout dans votre code, vous finirez par rendre votre code très lourd et vous ne pourrez même pas augmenter vos performances.

Le meilleur logiciel concurrent est sans verrou et sans attente ... ceci est difficile à réaliser en C# (.NET) puisque la plupart de vos collections ne sont pas verrouillées, sans attente ou même thread-safe. Il y a plusieurs discussions sur lock-free data structures. Beaucoup de gens ont referenced Boyet's articles (qui sont VRAIMENT bons) et certaines personnes ont jeté autour de la bibliothèque parallèle de tâches comme la prochaine chose dans la concurrence .NET, mais TPL ne vous donne vraiment pas beaucoup en termes de collections thread-safe.

.NET 4.0 sort avec Collections.Concurrent ce qui devrait aider beaucoup.Rendre votre bibliothèque entière concurrente ne serait pas recommandée car elle n'a pas été conçue avec la simultanéité en tête depuis le début. Votre prochaine option est de parcourir votre bibliothèque et d'identifier quelles parties de celle-ci sont en fait de bons candidats pour le multithreading, alors vous pouvez choisir la meilleure solution de concurrence pour eux et l'implémenter. La principale chose à retenir est que lorsque vous écrivez du code multithread, la concurrence devrait entraîner une augmentation du débit de votre programme. Si un débit accru n'est pas atteint (c'est-à-dire que vous correspondez ou que le débit est inférieur à celui de la version séquentielle), vous ne devez simplement pas utiliser la concurrence dans ce code.

+0

Merci Lirik. – ileon

+0

Note: La question mentionnée a été supprimée. La question recommandait le livre de Joe Duffy: [Programmation simultanée dans Windows] (http://a.co/fdZPQ7v), cet article web: [Threading in C#] (http: //www.albahari.com/threading /), et ce livre: [C# threading Handbook] (http://a.co/3B1NJuH) – jrh