2010-03-05 3 views
18

Je trouve ceci: Fast interprocess synchronization methodLes mutex pthread fonctionnent-ils entre les threads s'ils sont en mémoire partagée?

Je croyais qu'un mutex pthread ne peut être partagée entre deux fils dans le même espace d'adressage .

La question/réponses, il semble impliquer:

Si j'ai deux procesus séparés A & de B. Ils ont une région de mémoire partagée M. Je peux mettre un mutex PTHREAD dans M, serrure A, verrouiller B, déverrouillez en A; et B ne bloquera plus sur le mutex. Est-ce correct? Les mutex pThread peuvent-ils être partagés dans deux processus distincts? Editer: J'utilise C++, sur MacOSX.

+0

OP question connexe: http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou – Void

Répondre

1

je craignais qu'il pourrait y avoir une condition où un mutex en mémoire partagée pourrait ne pas se comporter correctement, donc je fait quelques recherches et est venu avec quelques documents qui traitent la question comme une évidence:

https://computing.llnl.gov/tutorials/pthreads/

en outre creuser, cependant, a montré que les anciennes versions de glibc ont souffert des problèmes dans les mutex de mémoire partagée: (Ce changement est ancienne, mais elle illustre le point.)

in linuxthreads/mutex.c 
int __pthread_mutexattr_setpshared(...) { 
    /* For now it is not possible to shared a conditional variable. */ 
    if (pshared != PTHREAD_PROCESS_PRIVATE) 
    return ENOSYS; 
} 

Sans plus de détails sur Quelle implémentation de pthread vous utilisez, il est difficile de dire si vous êtes en sécurité ou non. Ce qui m'inquiète, c'est que de nombreuses implémentations (et certains langages entiers, comme perl, python et ruby) ont un objet verrou global qui gère l'accès aux objets partagés. Cet objet ne serait pas partagé entre les processus et, par conséquent, alors que vos mutex fonctionneraient probablement la plupart du temps, vous pourriez vous retrouver avec deux processus manipulant simultanément le mutex en même temps.

Je sais que cela va à l'encontre de la définition d'un mutex, mais il est possible:

Si deux threads fonctionnent en même temps dans des processus différents, il implique qu'ils sont sur différents noyaux. Les deux acquièrent leur objet de verrou global et vont manipuler le mutex dans la mémoire partagée. Si l'implémentation de pthread force la mise à jour du mutex à travers les caches, les deux threads pourraient finir par se mettre à jour en même temps, les deux pensant qu'ils contiennent le mutex. C'est juste un vecteur d'échec possible qui me vient à l'esprit. Il pourrait y avoir un certain nombre d'autres. Quelles sont les spécificités de votre situation - OS, version pthreads, etc.?

+0

Votre lien est standard pThread Documentation. Comment est-ce que cela rend la question facile? – anon

5

Si votre C/bibliothèque pthread est conforme, vous devriez être en mesure de dire si elle prend en charge les mutex partagés entre plusieurs processus en vérifiant si la macro de test de fonctionnalité _POSIX_THREAD_PROCESS_SHARED est définie à une valeur autre que -1 ou en interrogeant la configuration du système à runtime utilisant sysconf(_SC_THREAD_PROCESS_SHARED) si la macro de test de fonctionnalité est non définie.

EDIT: Comme Steve pointed out, vous devrez configurer explicitement le mutex pour le partage de tous les processus en supposant la plate-forme prend en charge cette fonction comme je l'ai décrit ci-dessus.

+0

Sachez que les implémentations de système d'exploitation peuvent parfois définir '_POSIX_THREAD_PROCESS_SHARED' comme positif, mais ne pas l'implémenter réellement (car POSIX dit que c'est optionnel). Voir https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45 pour savoir comment boost fait face à cela. – Anon

13

Vous devez dire mutex être processus partagé quand il est inited:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

note en particulier « La valeur par défaut de l'attribut est PTHREAD_PROCESS_PRIVATE », ce qui signifie que l'accès à partir de différents processus est un comportement indéfini.

+1

+1. J'ai oublié de le signaler dans ma propre réponse. :) – Void

+0

Le lien vers la version actuelle: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html – alk

Questions connexes