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.
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. –