2011-01-12 17 views
1

Ich verwende eine MMAP-Datei, um Daten zwischen Prozessen zu teilen.IPC über mmap-Datei: sollten Atomics und/oder volatile verwendet werden?

Der Code ist wie folgt:

struct Shared 
{ 
int Data; 
}; 

int file = open("file.dat", O_RDWR); 
Shared* shared = static_cast<Shared*>(
    mmap(0, sizeof(Shared), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, file, 0)); 
shared->Data++; 

Die Fragen sind:

  1. Soll ich flüchtigen Qualifier verwenden (volatile int Data)?
  2. Sollte ich atomare Operationen auf die geteilten Daten verwenden (__sync_fetch_and_add(&(shared->Data), 1))?

Für die Zukunft: Volatile: Almost Useless for Multi-Threaded Programming.

Antwort

1

Sie sollten volatile nicht verwenden, wenn Sie eine ganze Zahl von mehr als einem Thread ändern. Flüchtiges ist nicht notwendig und nicht ausreichend. Atomare Operationen werden ausreichen.

+0

Threads haben nichts mit Prozessen zu tun (IPC steht für interprocess communication). –

+0

@VJo: Huh? Ein Prozess ist mindestens ein Thread. Pflege um zu erarbeiten? –

+0

Ja, es ist mindestens ein Thread, aber welche atomaren Operationen müssen mit Prozessen? In einem Fall von MMAP-Daten benötigen Sie nichts Spezielles, um darauf zuzugreifen. –

1

Es kann nicht garantiert werden, dass volatile über mehrere Prozessoren hinweg korrekt funktioniert. Die zu überprüfende Aufgabe besteht darin, ob dieser intrinsische Prozess die entsprechenden Speicherbarrieren während des Vorgangs einfügt.

Ist das eine Art Semaphor? Wenn dies der Fall ist, ist es besser, die Plattform-Implementierung eines solchen Konstrukts zu verwenden.

+0

Es ist kein Semaphor, es ist ein gemeinsamer Zähler. Das heißt, eine sinnvolle Datenmenge, die durch mehrere Prozesse verändert werden könnte. – VladV

-1

Keine Notwendigkeit für flüchtige und atomare Zugriffe. IPC mit mmap funktioniert gut ohne sie.

Wenn Sie informieren müssen, ob sich etwas geändert hat, können Sie message queues verwenden, aber Sie können sie auch anstelle von mmap verwenden (hängt davon ab, wie groß die Nachricht ist, die Sie senden möchten.) Mmap funktioniert gut, die Daten sind groß, aber MQ ist es kleiner als 200k)

+0

Der Hauptgrund, mmap hier zu verwenden, ist für Persistence. Ich möchte, dass die Daten zwischen den Läufen auf dem Datenträger gespeichert werden. Auf diese Weise muss ich keine Serialisierung implementieren (und kann auch sicher sein, dass die tatsächlichen Daten gespeichert werden, wenn der Prozess unerwartet beendet wird). – VladV

+0

@VladV In diesem Fall ist Shared Memory der richtige Weg. Nicht mmap –

+0

Kumpel, Sie scheinen keine Ahnung von den Dingen zu haben, von denen Sie sprechen. Sie können Shared Memory nicht verwenden, ohne mmap() zu verwenden. Tatsächlich wird der gesamte virtuelle Speicher eines Prozesses mit mmap() abgebildet. –