Shared memory - Bedarf für Synchronisierung
Habe ich ein Projekt erlebt, in denen die Kommunikation zwischen Prozessen, die mit Hilfe von shared memory (z.B. mit ::CreateFileMapping
unter Windows) und jedes mal, wenn einer der Prozesse wollte informieren, dass einige Daten im shared-memory, ein Synchronisations-Mechanismus mit Namen-Veranstaltungen informiert den Interessenten, dass die Inhalte des shared memory geändert.
Ich bin besorgt über die Tatsache, dass die entsprechenden Speicher-Zäune sind nicht vorhanden für den Prozess, der liest die neuen Informationen, um zu wissen, dass es es ungültig ist die Kopie der Daten und Lesen vom Hauptspeicher, sobald es ist "veröffentlicht", indem Sie die Produzenten-Prozess.
Wissen Sie, wie kann dies erreicht werden unter Windows mit shared memory?
BEARBEITEN
Wollte nur hinzufügen, dass nach dem erstellen der Datei mapping der Prozesse verwendet MapViewOfFile () - API nur einmal und jede neue änderung auf die freigegebenen Daten verwendet, die Zeiger, die durch den ersten Aufruf von MapViewOfFile() zum Lesen der neuen Daten, die gesendet werden über shared memory. Nicht korrekte Synchronisation erfordern, dass jedes mal, wenn änderungen der Daten im shared memory des Prozesses, der liest Daten erstellen müssen, MapViewOfFile (), jedes mal ?
- Eine gültige Synchronisations-Mechanismus, benannt Veranstaltungen haben sollte ordnungsgemäße Speicher Zäune im Ort. Haben Sie Beweise, dass dies geschehen könnte?
- In der Tat, es ist in der Regel der Fall ist, aber ist es garantiert, das von standard/Spezifikationen/etc.?
- Unter windows kann man mit CreateEvent-api für die Synchronisation. Ich weiß nicht, ob die Einstellung und Erwartung des Ereignisses produziert das erwerben/release notwendig mem Zäune, obwohl
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen Windows Benanntes Ereignis für die Signalisierung ändert, dann sollte alles OK sein.
Prozess Eine änderungen der Daten und fordert
SetEvent
.Prozess B wartet die Veranstaltung mit
WaitForSingleObject
oder ähnlich, und sieht, dass es eingestellt ist.Prozess B liest dann die Daten.
WaitForSingleObject
enthält alle die notwendige Synchronisation, um sicherzustellen, dass die änderungen, die Ein Prozess vor dem Aufruf vonSetEvent
gelesen von Prozess B.Natürlich, wenn Sie änderungen an den Daten nach aufrufen
SetEvent
, dann diese kann oder auch nicht zeigen, wenn Prozess B liest die Daten.Wenn Sie nicht wollen, um Ereignisse, könnten Sie ein Mutex erstellt mit
CreateMutex
oder Sie schreiben könnten, lock-free, code mit derInterlocked...
Funktionen wieInterlockedExchange
undInterlockedIncrement
.Jedoch Sie die Synchronisierung, Sie müssen nicht anrufen
MapViewOfFile
mehr als einmal.Was Sie suchen für shared memory unter windows ist die Funktion InterlockedExchange. Finden Sie die msdn-Artikel hier. Der WIRKLICH wichtige Teil zitiert:
Wird diese Funktion cross-Prozess. Ich habe mit ihm gearbeitet, bevor, und fand es 100% zuverlässig für die Implementierung einer mutex-wie konstruieren oben auf den gemeinsamen Speicher zu.
Wie Sie das tun, ist, dass Sie den Austausch mit der "set" - Wert. Wenn Sie "löschen" zurück, Sie haben es (war es klar), aber wenn Sie "set" wieder, dann wird jemand anderes es hatte. Sie loop -, Schlaf zwischen den Schleifen, usw., bis Sie "bekommen" es. Im Grunde ist diese:
Wie oben, und Schleife, bis Sie "bekommen" es.
Global\
). Wenn dies ist ein deal-breaker, müssen Sie möglicherweise zu bleiben benannt Mutexe oder eine andere Methode.Let ' s call Ein Prozess der Daten-Produzent und Prozess B die Daten der Verbraucher. Bis jetzt haben Sie einen Mechanismus für Prozess A zu Benachrichtigen Prozess B, der neue Daten generiert wurden. Ich schlage vor, Sie erstellt eine reverse-Benachrichtigung (von B nach A), erzählt Prozess Ein, dass die Daten verbraucht wurde. Wenn aus performance-Gründen, die Sie nicht möchten, dass Ein Prozess warten, bis die Daten verbraucht werden, könnte man die Einrichtung eines ring-Puffer im shared memory.