Les problèmes de threading des «programmeurs de niveau système» C / C ++ sont-ils sensiblement différents de ceux rencontrés par les programmeurs Java?

StackOverflow https://stackoverflow.com/questions/641514

Question

Je recherche un travail de développement et constate que de nombreuses annonces spécifient que les développeurs doivent être familiarisés avec le multithreading. Cela apparaît à la fois pour les offres d'emploi Java et pour les offres C ++ impliquant "la programmation système". sous UNIX.

Ces dernières années, j'ai travaillé avec Java et utilisé ses divers mécanismes de synchronisation.

À la fin des années 90, j’ai beaucoup travaillé sur le C ++, mais très peu de threads. Au collège, cependant, nous avons utilisé des threads sous Solaris.

Ma question est de savoir s'il existe des différences significatives entre les problèmes rencontrés par les développeurs en C / C ++ et ceux en Java, et si les techniques permettant de les résoudre sont fondamentalement différentes. Java inclut évidemment des mécanismes plus agréables et des versions synchronisées de collections, etc.

Si je souhaite actualiser ou réapprendre le threading sous UNIX, quelle est la meilleure approche? Quelle bibliothèque devrais-je regarder? etc. Existe-t-il un excellent didacticiel sur les threads en c ++?

Était-ce utile?

La solution

Les défis fondamentaux du threading (synchronisation, conditions de concurrence, communication inter-thread, nettoyage des ressources, par exemple), mais Java le rend beaucoup plus facile à gérer avec un garbage collection, des exceptions, des objets de synchronisation avancés, une prise en charge avancée du débogage avec réflexion.

Avec C ++, il est beaucoup plus probable que votre mémoire soit corrompue et "impossible". conditions de course. Et vous aurez besoin d'écrire beaucoup plus de primitives de threads de bas niveau ou de vous fier à des bibliothèques (comme boost) qui ne font pas partie du langage normalisé.

Autres conseils

C ++ est en fait plus facile d’écrire du code complexe complexe que Java car il a une fonctionnalité qui lui manque - RAII ou "l'acquisition des ressources est une initialisation". Cet idiome est utilisé pour tous les contrôles de ressources dans du code C ++ bien écrit, mais est particulièrement approprié dans le code multi-thread où la gestion automatique de la synchronisation est indispensable.

Consultez les pthreads et boost (celui des pthreads était aléatoire, mais il semble correct comme point de départ).

À un niveau élevé, les problèmes pour Java / C / C ++ / sont les mêmes. Les détails de la résolution du problème (fonctions à appeler, classes à créer, etc.) varient d’une langue à l’autre.

La récupération de place permet aux threads de programmation de ne pas perdre de mémoire, et il existe des objets de fantaisie que vous pouvez faire pour régler le moment des collectes.

Les destructeurs déterministes facilitent les tâches de programmation qui ne génèrent pas de zombies, voir l'article d'ACM ici

Cela dépend du niveau auquel vous choisissez de travailler. Intel TBB et OpenMP traitent un grand nombre de cas courants à un niveau assez élevé. Les threads Posix, les API Windows et les bibliothèques portables telles que les threads Boost vous rapprochent du même niveau que les primitives en Java.

Les

threads C ++ 0x (en particulier avec les barrières de mémoire d'acquisition et de libération) vous permettent d'aller encore plus bas pour plus de contrôle et de complexité que les offres Java (le marquage d'une variable volatile en Java lui donne Les barrières de mémoire d’acquisition et de libération, mais en Java, vous ne pouvez pas demander uniquement la barrière d’acquisition ou de libération, vous pouvez le faire en C ++ 0x).

Veuillez noter que le modèle de threading de C ++ 0x est délibérément bas, avec l’espoir que les gens construiront des éléments comme TBB par dessus et que, lors de la prochaine réunion du comité de normalisation, ils seront en mesure de déterminer lequel de ceux qui sont supérieurs Les bibliothèques de niveau et les boîtes à outils fonctionnent assez bien pour apprendre.

Quel que soit le langage de programmation utilisé, les idiosyncrasies de thread sont courantes. Par exemple, même sous OS, les threads POSIX & amp; Les threads WIN32 ont le même ensemble d'idiosyncrasies logiques, bien que les appels d'API & amp; implémentation native Le matériel / noyau sous-jacent WRT peut changer, mais pour les programmeurs système, la pensée logique à propos des threads & amp; comment les faire fonctionner comme prévu & amp; pour y parvenir est la partie la plus difficile. Ceci est même vrai en venant aux langages de programmation. Si vous comprenez vraiment le concept de threading & amp; la synchronisation des threads vous êtes bon pour aller & amp; utilisez-les dans tous les langages de programmation que vous aimez. Étant donné que ces langages de programmation fournissent des suggestions syntaxiques en plus de l’implémentation native de la synchronisation thread / thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top