Comment puis-je synchroniser les accès à la mémoire partagée dans LynxOS/POSIX?
Je suis en œuvre deux processus sur un LynxOS SE POSIX (conforme) système de communication par mémoire partagée.
Un processus de va agir comme un "producteur" et de l'autre un "consommateur". Dans un environnement multi-thread système de mon approche serait d'utiliser un mutex et condvar (variable d'état) de la paire, avec le consommateur en attente sur le condvar (avec pthread_cond_wait
) et le producteur de signalisation (avec pthread_cond_signal
) lorsque la mémoire partagée est mise à jour.
Comment puis-je atteindre cet objectif dans un multi-processus, plutôt que de multi-thread, de l'architecture?
Est-il un LynxOS/POSIX façon de créer un condvar/mutex paire qui peut être utilisé entre les processus?
Ou d'un autre mécanisme de synchronisation plus appropriée dans ce scénario?
pthread_condattr_setpshared
mais j'ai raté le pthread_attr_setscope
. Si vous modifiez votre commentaire à la réponse, je vais upvote.Semble que j'avais un peu mal informé, pthread_condattr_setpshared est en effet ce que vous pouvez utiliser, pthread_attr_setscope traite de la planification des threads.
OriginalL'auteur GrahamS | 2010-04-06
Vous devez vous connecter pour publier un commentaire.
Le moyen standard pour créer un processus partagé mutex/cond. variable est de les initialiser avec un attribut de l'endroit où vous définissez pthread_mutexattr_setpshared/pthread_condattr_setpshared. Vérifier si LynxOS prend en charge.
Vous aurez naturellement besoin de mutex/cond. les variables dans la mémoire partagée, en quelque sorte, alors tous les processus de l'utiliser.
OriginalL'auteur nos
De crédit va à @nsa, mais j'aimerais développer un peu sa réponse.
En fin de compte (à l'exclusion de la gestion d'erreur pour plus de clarté) j'ai fait comme suit:
1. Définir la mémoire partagée de la structure
Il contient de l'inter-processus de synchronisation des objets et les données à partager.
2. Créer de la mémoire partagée et la taille de l'ensemble (processus Maître)
Sur la Maîtrise du processus de créer une nouvelle mémoire partagée objet:
2. OU Ouvrir la mémoire partagée (Esclave processus)
Sur l'Esclave, juste l'attacher à un objet existant:
3. Mmap dans l'espace de processus
4. Initialiser les variables de synchronisation (processus Maître uniquement)
.
Mutex et cond peut maintenant être utilisé comme normal pour contrôler l'accès aux données partagées.
Les seuls véritables pièges à ce que le Maître a engendré de la mémoire partagée et les initialisé la synchronisation des variables avant l'Esclave processus est lancé. Et assurez-vous de ranger avec
munmap()
etshm_unlink()
que nécessaire.Remarque: XSI Alternative
POSIX:XSI extension a d'autres fonctions pour le partage de la mémoire (
shmget()
,shmat()
etc) qui peut être plus utile si ils sont disponibles, mais ils ne sont pas sur la version de LynxOS-SE que j'utilise.Dans le #2 du code de l'esclave processus, j'ai aussi eu à faire appel ftruncate(fd, sizeof(shared_data_t)) après l'appel de shm_open. C'est juste les paramètres de shm_open qui diffèrent entre maître et de l'esclave pour le #2. Sans le ftruncate dans la traite des esclaves, j'ai été faire EFAULT et d'autres erreurs lorsque vous essayez d'utiliser un flexible de membre de tableau à la fin de ma structure.
OriginalL'auteur GrahamS
C'est fait avec sans nom sémaphores POSIX, c'est à dire les sémaphores sont eux-mêmes placés dans la mémoire partagée.
Sans nom sémaphores sont très rapides entre les processus non-soutenu cas en évitant un appel système.
OriginalL'auteur Nikolai Fetissov
Vous pouvez réaliser cela avec la mémoire partagée/sémaphore de la CIB.
Voici un article avec un joli exemple:
http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm
OriginalL'auteur mcabral