2010-03-05 9 views
18

fand ich dies: Fast interprocess synchronization methodArbeiten Pthread-Mutexe über Threads, wenn sie sich im Shared Memory befinden?

ich, dass ein pthread Mutex kann nur zwischen zwei Threads in dem gleichen Adressraum geteilt glaube verwendet werden.

Die Frage/Antworten scheint es bedeuten:

Wenn ich zwei separate proceses B. A & haben Sie verfügen über einen gemeinsam genutzten Speicherbereich M. ich einen pThread Mutex in M ​​setzen, Schloss in A, sperren in B, entsperren in A; und B wird den Mutex nicht mehr blockieren. Ist das richtig? Können pThread-Mutexe in zwei separaten Prozessen geteilt werden?

Edit: Ich benutze C++, auf MacOSX.

+0

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

Antwort

1

Ich war besorgt, dass es ein Zustand, wo ein Mutex im gemeinsam genutzten Speicher könnte richtig verhalten ausfallen, so habe ich einige Graben und kam mit einigen Dokumenten auf, die das Thema wie ein Kinderspiel behandeln:

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

weitere Graben, zeigte jedoch, dass ältere Versionen von glibc erlitten Probleme im gemeinsam genutzten Speicher mutexes: (Dies ist eine alte Veränderung, aber es zeigt den Punkt.)

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; 
} 

Ohne weitere Einzelheiten über Welche Implementierung von Pthread Sie verwenden, ist es schwierig zu sagen, ob Sie sicher sind oder nicht.

Mein Grund zur Sorge ist, dass viele Implementierungen (und einige ganze Sprachen, wie Perl, Python und Ruby) ein globales Sperrobjekt haben, das den Zugriff auf gemeinsame Objekte verwaltet. Dieses Objekt würde nicht zwischen Prozessen aufgeteilt werden. Während also Ihre Mutexe wahrscheinlich die meiste Zeit arbeiten würden, könnten Sie zwei Prozesse haben, die gleichzeitig den Mutex manipulieren.

Ich weiß, dass dies in krassem der Definition eines Mutex, aber es ist möglich:

Wenn zwei Threads zur gleichen Zeit in verschiedenen Prozessen arbeiten, es bedeutet, dass sie auf verschiedene Kerne sind. Beide erhalten ihr globales Lock-Objekt und manipulieren den Mutex im Shared Memory. Wenn die pthread-Implementierung die Aktualisierung des Mutex durch die Caches erzwingt, können beide Threads gleichzeitig mit der Aktualisierung enden, da beide denken, dass sie den Mutex halten. Dies ist nur ein möglicher Fehlervektor, der mir in den Sinn kommt. Es könnte eine beliebige Anzahl von anderen geben. Was sind die Besonderheiten Ihrer Situation - Betriebssystem, Pthreads-Version usw.?

+0

Ihr Link ist Standard pThread Dokumentation. Wie macht es das Problem ein Kinderspiel? – anon

5

Wenn Ihr C/Pthread Bibliothek konform ist, sollten Sie in der Lage sein zu sagen, ob es über mehrere Verfahren geteilt mutexes unterstützt durch Prüfen, ob die _POSIX_THREAD_PROCESS_SHARED Feature-Test-Makro auf einen anderen Wert als -1 oder durch Abfragen der Systemkonfiguration an definiert ist Laufzeit unter Verwendung sysconf(_SC_THREAD_PROCESS_SHARED), wenn dieses Feature Testmakro ist undefined.

BEARBEITEN: Als Steve pointed out müssen Sie explizit den Mutex für die gemeinsame Nutzung von Prozessen konfigurieren, vorausgesetzt, die Plattform unterstützt diese Funktion wie oben beschrieben.

+0

Beachten Sie, dass Betriebssystemimplementierungen manchmal '_POSIX_THREAD_PROCESS_SHARED' als positiv definieren, aber nicht implementieren können (weil POSIX dies als optional angibt). Siehe https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45 für wie Boost damit umgeht. – Anon

13

Sie müssen den Mutex zu sagen, prozess geteilt zu sein, wenn es inited ist:

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

Hinweis insbesondere „Der Standardwert des Attributs ist PTHREAD_PROCESS_PRIVATE“, das bedeutet, dass es von verschiedenen Prozessen Zugriff ist undefiniertes Verhalten.

+1

+1. Ich habe vergessen, darauf in meiner eigenen Antwort hinzuweisen. :) – Void

+0

Der Link zur aktuellen Version: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html – alk