web-dev-qa-db-fra.com

Implémentation de threadpool C existante

Quelle (s) implémentation (s) open-source en C pour un pool de threads pthreads recommanderiez-vous?

Points supplémentaires si cette implémentation est:

  • Léger: glib, APR, NSPR et autres sont livrés avec un gros buy-in, je préfère n'avoir que 2 fichiers (en-tête et implémentation).
  • Testé sur plusieurs plateformes (Linux, BSD, Mac OS X, etc.).
  • Toujours maintenu.
36
Mathias Brossard

J'ai travaillé sur la création de quelque chose que je pourrais utiliser et je l'ai publié sur github: cela s'appelle inimaginablement threadpool .

24
Mathias Brossard

Si votre objectif est léger, la dernière chose que vous souhaitez est une implémentation pré-écrite, à usage général et basée sur l'abstraction de haut niveau. L'implémentation d'un pool de threads vous-même, adapté à votre tâche particulière, est assez simple, mais vous pouvez également vous demander si vous avez réellement besoin d'un pool de threads ou si vous seriez bien de simplement créer et détruire des threads si nécessaire.

Sans en savoir plus sur votre candidature, je ne saurais vous donner de conseils bien plus précis. Mais les outils que vous pourriez trouver utiles sont:

  • Variables de condition
  • Sémaphores
  • Une file d'attente de travaux protégée par un mutex
  • Files d'attente de messages POSIX

Voici une implémentation avec ces fonctionnalités:

  • Conforme à ANSI C et POSIX
  • API minimale mais puissante
  • Synchronisation depuis l'utilisateur
  • Documentation complète
5
Pithikos

J'ai déjà utilisé this , qui n'est pas en fait une implémentation officielle en soi. Il utilise pthreads comme vous l'avez demandé et devrait vous donner quelques idées de ce que vous devez faire. (Voir threadpool.h, threadpool.c, threadpool_test.c, et le Makefile pour des instructions sur la façon de compiler.) Vous devrez évidemment refactoriser car c'est l'intention d'origine est probablement différent du vôtre. C'est plutôt bien commenté en fait.

Même si cela s'écarte de la question d'origine, je voudrais également mentionner que la nouvelle norme C, officieusement C1X (voir wikipedia, limite d'hyperlien), a prévu la prise en charge des threads N1570 (google it, hyperlink limit again!) (7.31. 15).

Mon conseil personnalisé serait de m'assurer que votre application peut être exécutée en parallèle, et si la surcharge de création d'un nouveau thread est ainsi haut que vous ne pouvez pas vivre sans un pool de threads. Personnellement, j'ai fait une erreur sur ces deux parties et je me suis retrouvé avec des implémentations plus lentes que mon application à thread unique. En outre, vous souhaiterez peut-être être conscient de différents problèmes, y compris les verrous de cache et les échecs, qui pourraient en fait dégrader les performances de votre application.

Je suis probablement en train de bavarder maintenant, mais bonne chance.

2
Arka