Synchronisation der API einer dll
-
Ich habe eine DLL erstellt, die gleichzeitig von unterschiedlichen Programmen geladen werden kann.
Da die Funktionen teilweise das selbe Gerät ansprechen brauche ich eine Synchronisierung.
Die Frage ist ob ich hier normale Synchronisierungsobjekte wie Mutex, etc. anwenden kann (die zur Threadsynchronisierung innerhalb eines Prozesses verwendet werden), oder ob man hier Methoden der Interprozesssynchronisierung anwenden muss wie z.B.: Named Mutex (oder Semaphoren) und diese dann mit OpenMutex.. vor der Anwendung öffnen muss.Ich habe leider nichts wirklich brauchbares gefunden , gibt es vielleicht ein Beispiel dazu?
Danke
-
Für Resourcen nimmst man eine Semaphore.
Für die Verwendung in mehreren Anwendungen musst du ihr einen Namen verpassen.Funktion unter Windows heißt glaube ich CreateSemaphore.
-
@templäd:
Wieso sollte er eine Semaphore verwenden wenn eine (named) Mutex reicht?@ac2806: Ich denke das gehört eher nach WinAPI.
Named Mutex (oder Semaphoren) und diese dann mit OpenMutex
Ja, eine named Mutex. Du kannst aber überall CreateMutex machen, OpenMutex brauchst du normalerweise nicht dafür.
-
Wenn ich überall CreateMutex verwende, wird dann nicht jedes Mal ein neuer Mutex erzeugt?
Wie funktioniert der Ablauf?
Ich dachte, dass in einer Initialisierungsfunktion der Mutex mit dem Namen erzeugt wird und bei der Verwendung dann ein Handle auf den Mutex mit OpenMutex geholt wird, der dann für z.B. WaitforSingleObject verwendet wird.Könnte man auch den Handle verwenden, der bei der Initialisierungsroutine bei CreateMutex zurückgegeben wird und diesen dann global zur Verfügung stellen?
Bekommt ein Synchronisationsmechanismus eine prozessübergreifende Funktion indem er einfach einen Namen bekommt?
-
hustbaer schrieb:
@ac2806: Ich denke das gehört eher nach WinAPI.
Nicht unbedingt, man könnte dazu wohl auch boost verwenden:
http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess.html@ac2806,
Wie es genau auf Windows funktioniert weiss ich nicht, allerdings kann man Mutex Systemweit anlegen unter einem bestimmten Namen. Über diesen Namen kann man dann in anderen Programmen das Handle holen und entsprechend prüfen. Boost hat das ganze glaub ich ein wenig vereinfacht und vor allem liegt es platformunabhängig und in C++ vor.Grüssli
-
Wenn ich überall CreateMutex verwende, wird dann nicht jedes Mal ein neuer Mutex erzeugt?
guck doch ma in der msdn... so weit ich weiß, kansnt du da nen namen mit angeben - wenns den schon gibt, wird kein neuer mutex erstellt sondern der pointer zu dem bestehenden (mit dem name halt) zurückgegeben...
kA, was boost da kann, ich weiß nur, dass es mit mutexen ziemlich einfach ist, aber halt abhängig vom os...bb