2008-12-10 13 views
0

Je voudrais utiliser des sémaphores POSIX pour gérer les get et put atomiques à partir d'un fichier représentant une file d'attente. Je veux la flexibilité d'avoir quelque chose de nommé dans le système de fichiers, afin que des processus complètement indépendants puissent partager une file d'attente. Je pense que ce plan exclut les pthreads. Les posix sémaphores nommés sont parfaits pour mettre quelque chose dans le système de fichiers que tout processus peut voir, mais je ne peux pas trouver la CondWait primitive standard:Est-il possible d'éviter une course de réveil avec seulement des sémaphores POSIX? Est-ce bénin?

... decide we have to wait .... 
CondWait(sem, cond); 

Lorsque CondWait est appelé par un processus, il atomiquement messages et attend à ETM sur cond. Quand un autre processus poste à cond, le processus d'attente ne se réveille que s'il peut décrémenter atomiquement sem aussi. L'alternative de

... decide we have to wait .... 
sem_post(sem); 
sem_wait(cond); 
sem_wait(sem); 

est soumise à une condition de concurrence dans laquelle d'autres signaux de traitement condent juste avant que ce processus ne l'attende. Je n'ai presque jamais fait de programmation concurrente, alors j'ai pensé que je demanderais SO: si j'utilise un sémaphore de comptage POSIX standard pour la variable de condition, est-il possible que cette course soit bénigne? Juste au cas où quelqu'un voudrait un contexte plus large, je construis des opérations get et put pour une file d'attente atomique qui peut être appelée à partir de scripts shell.

Répondre

2

Comme il n'y a pas d'autres réponses que je vais suivre avec ce que j'ai appris:

  • Pthreads ne fonctionnera pas avec ma demande parce que j'ai processus sans un ancêtre commun qui ont besoin de partager une file d'attente atomique .
  • sémaphores Posix sont sous réserve de la course de réveil-attente, mais parce que contrairement aux variables de condition classiques ils comptent les sémaphores, la course est bénigne. Je n'ai pas de preuve de cette affirmation, mais j'ai un système qui fonctionne depuis deux jours et qui fonctionne bien. (Je ne sais pas du tout ce que je veux dire, mais au moins cela signifie que j'ai fait le travail.)
  • Les sémaphores Posix nommés sont difficiles à collecter dans le système de fichiers.

En résumé, les sémaphores nommés Posix avéré être une bonne base pour la mise en œuvre d'une abstraction de la file d'attente atomique à partager entre les processus non liés.

Je voudrais avoir une preuve ou un modèle SPIN validé, mais comme mon besoin pour l'application est limité, il semble peu probable que j'en écrirai un. J'espère que cela aidera quelqu'un d'autre qui voudra utiliser des sémaphores Posix.

-1

Vous recherchez: pthread_cond_wait, pthread_cond_signal, je pense.
Si vous utilisez des threads posix, les méthodes pthread fournissent les fonctionnalités de CondWait et Signal.
Regardez ici pour le code source sur pthreads multi-processus via la mémoire partagée.
http://linux.die.net/man/3/pthread_mutexattr_init
C'est pour Linux, mais les documents sont posix. Ils sont similaires à Solaris, mais vous devez parcourir les pages de manuel de votre système d'exploitation.

+0

Pouvez-vous expliquer comment cela est possible avec plusieurs processus qui ne partagent pas un ancêtre commun au-delà de init? Je pense que les pthreads doivent tous être démarrés par le même processus. Pas facilement adapté aux scripts shell. –

0

Selon la norme POSIX, l'ensemble des routines sémaphores est:

  • sem_close()
  • sem_destroy()
  • sem_getvalue()
  • sem_init()
  • sem_open()
  • sem_post()
  • sem_timedwait()
  • sem_trywait()
  • sem_unlink()
  • sem_wait()

Les fonctions sem_trywait() et sem_timedwait() pourrait être ce que vous recherchez.

+0

Ce sont deux fonctions utiles, mais pour déterminer s'il existe une condition de concurrence, elles peuvent être traitées de la même manière que sem_wait(). Je crois qu'il y a une course mais parce que les sémaphores POSIX comptent les sémaphores, la course est bénigne. –

0

Je sais que cette question est ancienne, mais la solution évidente serait d'utiliser simplement les mutex partagés par le processus et les variables de condition situées dans un fichier que vous pouvez mmap.

+0

Avez-vous manqué les 6 derniers mots de ma réponse? * dans un fichier, vous pouvez 'mmap' *. Si vous faites cela, bien sûr, des processus indépendants peuvent le partager. Ils viennent juste de le 'mmap'. –

+0

J'ai raté les six derniers mots de votre réponse. –

Questions connexes