2010-10-17 4 views
-1

Je ne veux pas réinventer la roue, et ce que je cherche existe probablement déjà dans le monde des logiciels libres.bibliothèque utilitaire multithread polyvalente basée sur pthread

Je recherche une bibliothèque d'utilitaires pthread bases qui implémente des primitives souvent utilisées pour faire la communication entre les threads. Mon principal besoin est une sorte de file d'attente de blocage pour les messages de taille fixe et la possibilité d'attendre que les données arrivent sur plusieurs files d'attente en même temps (ce que vous faites habituellement en utilisant poll et select avec des handles de fichiers).

Est-ce que quelque chose comme ça existe?

Le langage de programmation est C++ mais je vais bien avec une bibliothèque C. OS est Linux mais tout ce que posix fera.

EDIT

Je ne suis pas à la recherche d'une enveloppe mince autour pthreads (comme boost :: fil ou si). Je l'ai déjà en place. Je suis à la recherche de primitives de niveau supérieur. Fondamentalement ce que java.util.concurrancey offre aux gars java.

Répondre

0

Vous pouvez essayer OpenMP, même si je ne suis pas sûr que ce soit basé sur l'API pthread ou non.

+0

OpenMP n'est pas ce que je cherche. Cela m'aidera à paralléliser les programmes. Mon programme utilise déjà des threads, mais le code de la colle pour passer des messages/données entre les threads est ce que je recherche. (mon code de colle fonctionne, mais à long terme j'ai besoin de quelque chose de mieux) –

2

Vos exigences sont déjà cuites dans POSIX Message Queues.

Au lieu d'utiliser select(), vous pouvez le faire en sens inverse. Plutôt que d'attendre dans un select(), vous pouvez utiliser mq_notify() pour vous dire quand il y a quelque chose à lire. Les MQ vous donnent la possibilité d'avoir un signal délivré ou de les faire apparaître un nouveau thread pour lire la file d'attente.

Si vous avez vraiment l'intention d'utiliser select(), Linux rend cela indolore puisque le type mqd_t est en fait un descripteur de fichier. Vous pouvez simplement utiliser le mqd_t retourné depuis mq_open() comme n'importe quel autre FD dans select().

Notez que l'utilisation d'un mqd_t dans select() n'est pas portable. En théorie, vous devriez être capable de faire quelque chose de similaire sur d'autres systèmes mais je ne l'ai jamais testé. Puisque les MQ POSIX ont un chemin vers une entrée du système de fichiers, vous devriez pouvoir faire un straight open() sur le chemin et utiliser le descripteur de fichier retourné dans select(), en le mappant au mqd_t utilisé dans mq_open() pour déterminer quelle file d'attente lire. Encore une fois, je n'ai jamais essayé.

1

Il y a toujours boost :: thread.

Questions connexes