2010-10-10 7 views
4

Je sais que l'implémentation des threads dans le noyau Linux et dans la libc a subi de gros changements par le passé. Quelle est la meilleure façon d'utiliser les threads aujourd'hui à partir des programmes C? (Je ne sais même pas s'il y a plus d'une API que je peux utiliser - Je sais juste pthreads)Bonne façon de faire la programmation des threads sous Linux

Je ne me soucie pas trop de noyaux anciens et les versions de libc, mais je ne soin de utilisation efficace de plusieurs cœurs et de la portabilité (je souhaite que mon code fonctionne aussi sur d'autres Unix).

Si j'utilise simplement des threads Posix comme décrit dans man 7 pthreads et restreindre mon code à l'API POSIX, cela sera-t-il OK?

éditer: merci à tous ceux qui ont répondu. J'ai pensé à utiliser une bibliothèque de pools de threads disponible, mais pour ce projet, ce n'est vraiment pas une option.

Répondre

3

Pour la plupart, oui. C'est le point de POSIX. Chaque plate-forme sur laquelle vous envisagez de porter (y compris le système d'exploitation, le numéro de noyau et l'architecture) peut avoir des différences dont vous devez tenir compte. Ceci est votre devoirs :)

En outre, comme un conseil, des cadres tels que Qt et les paquets de bibliothèque Boost comme font beaucoup de ce travail plus élégant. Si vous pouvez les intégrer, je le recommande fortement.

0

L'utilisation de threads est difficile et sujette aux erreurs. Évitez de les programmer directement, si possible. Un document bien écrit sur le sujet peut être trouvé here.

Le parallélisme multicœur peut être réalisé de différentes manières, autres que l'utilisation directe de fils. Le plus simple est le parallélisme multi-processus. Pour n cœurs, exécutez n processus et subdiviser la charge de travail entre eux. Ceci est plus approprié lorsque les tâches sont à grain grossier et nécessitent peu ou pas de communication entre eux. Lorsqu'il doit être en cours de traitement, vous pouvez utiliser la transmission de messages pour toutes les communications et la synchronisation entre les threads et essayer de toujours transmettre des objets immuables sous la forme de messages.

+0

Les processus multiples ne s'échelonnent pas bien sur la même machine, prennent souvent 3-4 fois la quantité de travail pour les petites tâches (puisque vous devez implémenter un mécanisme de communication qui aura néanmoins un blocage potentiel, livelock, et tous les d'autres types de "verrous" non souhaités). Cependant, si vous pouvez vous en passer avec cette méthode, vous pouvez avoir plus d'accélération puisque vous pourrez peut-être réduire le nombre de blocages dans votre algorithme. –

+0

Merci pour le commentaire @San. Tu as raison; les processus multiples ne s'adaptent pas bien s'il y a une communication considérable entre les processus. J'ai modifié ma réponse pour clarifier cela. –

2

Les threads POSIX sont un bon choix et un populaire. Vous pouvez également regarder Boost Threads et Intel Thread Building Blocks pour d'autres options lors de la programmation en C/C++, plutôt que de coder directement sur l'API POSIX. En particulier, Intel TBB prétend utiliser des processeurs multicœurs de manière simple et efficace. Je n'ai pas beaucoup d'expérience avec TBB, mais j'ai vu des démos où l'utilisation de TBB réduisait considérablement la taille et la complexité du code et prenait des ordres de grandeur plus rapidement qu'une implémentation écrite en C++ en utilisant des threads POSIX écrits par un ingénieur expérimenté.

+0

Merci! Puisque C++ n'est pas une option pour ce projet, je suppose que je vais utiliser l'API POSIX ... – Jay

+0

N'oubliez pas 'fork()'/'clone()' et 'mmap()', si vous êtes se sentir courageux ... – Jonathan

Questions connexes