Frage von JamesOffice, 23

Problem bei mehrfach paralleles starten eines Programmes?

Hallo, Kann ein Synchronisation Problem auftreten, wenn ein Programm mehrfach parallel auf einem Rechner gestartet wird und die Shared-Memory-ID im Source-Code des Programms defeniert ist? kann ich das durch ein Schloss-Variable lösen? oder trifft hier Synchronisation gaaaar nicht zu und kann was anderes auftreten, was mir im Moment gar nicht einfällt! Danke euch allen :)

Expertenantwort
von TeeTier, Community-Experte für programmieren, 14

Das wird definitiv zu Problemen führen, wenn du Nicht-Anonyme IPC-Mechanismen verwendest.

Je nachdem ob du z. B. SysV Message Queues oder Named Pipes benutzt, kannst du dann natürlich Synchronisationsprobleme mit einem Lock o. ä. umschiffen.

Deshalb ist es z. B. bei einem fork() besser, vorher lieber eine anonyme Pipe mit pipe() vorzubereiten, als eine Fifo mit mkfifo() (oder früher mknod()) bei fixer Pfadangabe zu verwenden.

Hat aber alles seine Vor- und Nachteile! :)

Kommentar von JamesOffice ,

RESPEKT und noch dazu herzlichen Dank!
eine Ergänzung zu meiner Frage:
Kann es dann garantiert werden, dass der Verbraucher immer die aktuellsten Daten erhält, wenn der Zugriff auf die Daten im Shared-Memory Segment durch eine Schloss-Variable innerhalb des Shared-Memory synchronisiert wird? Ja? Nein? Wieso?

Kommentar von TeeTier ,

Nein, nur mit einem Lock wirst du nicht garantieren können, welchen Prozess der Scheduler als nächstes aufweckt, sodass dieser dann, direkt nach einer Freigabe desselben Locks durch einen anderen Prozess, auf den selben Shared-Memory zugreifen kann.

Wenn du 3 Prozesse hast, und Prozess 2 wird aufgeweckt, wird sich nur mit einem Lock nicht sagen lassen können, ob vorher Prozess 1 oder 3 in den besagten Speicher geschrieben hat.

Anders herum wird es sich nach der Lock-Freigrabe durch z. B. Prozess 3 nicht sagen lassen können, ob als nächstes Prozess 1 oder 2 darauf zugreifen wird.

Ich vermute aber gerade - bei nochmaligem Durchlesen - dass ich deine letzte Frage etwas falsch verstanden habe ...

Ein Prozess, der den Lock erhält, ist logischerweise immer der "Letzte", und hat deshalb Zugriff auf die Daten, die durch den Lock geschützt werden. Das sind dann Prinzipbedingt immer die "Aktuellsten", weil sie ja vom vorherigen Thread geschrieben (oder zumindest nicht verändert) wurden.

Allerdings trifft man oft auf Bugs, bei denen geteilte Speicherbereiche nicht ordentlich und durchgängig durch Locks geschützt werden ... dabei entsteht dann natürlich Datensalat. Aber das ist ein anderes Thema. :)

Ich hoffe, dass ich halbwegs das beantwortet habe, was du eigentlich wissen wolltest und wir hier nicht aneinander vorbei reden. :)

Keine passende Antwort gefunden?

Fragen Sie die Community