Wie kann ich mit boost in c ++ etwas Ähnliches wie ein Semaphor erreichen? [Duplikat]

7

Ich habe bemerkt, dass Boost Semaphoren nicht zu unterstützen scheint. Was ist der einfachste Weg, um einen ähnlichen Effekt zu erzielen?

    
jonderry 13.10.2010, 23:24
quelle

3 Antworten

6

Sie müssen entweder Interprozess-Semaphor verstärken oder Boost Thread Synchronisation Primitive.

Mutex / Lock und Bedingung sind Grundelemente, die häufig verwendet werden, um den Zugriff auf gemeinsam genutzte Ressourcen über mehrere Threads eines einzelnen Prozesses hinweg zu synchronisieren. Es gibt exklusiv , Leser-Schreiber und rekursive / reentrante Arten von Mutexen. Mutex ist mit anderen Worten eine exklusive Sperre. Bedingung wird verwendet, um Atomizität zu erreichen, wenn Sie den Mutex entsperren und warten müssen, bis sich das Objekt ändert. Wenn Sie auf eine Bedingung warten, entsperrt es den Mutex und garantiert als Entsperrung + Aufruf zu warten ist atomar und keine anderen Threads können eine Ressource zwischen diesen beiden Operationen ändern.

Semaphore, in einem anderen Fall, ist eine Mischung aus Bedingung und Mutex und wird für genau denselben Zweck verwendet, aber um den Zugriff über Prozesse hinweg zu synchronisieren.

Siehe Mutex vs Semaphore .

Es gibt auch eine blockierungsfreie / blockierungsfreie Synchronisation , die heutzutage sehr populär wird . Ich persönlich benutze es in Hochfrequenz-Trading-Anwendungen, wenn die Datenmenge relativ groß ist und geringe Latenz eine Rolle spielt.

In deinem Fall gehe ich davon aus, dass 5 Philosophen in einem einzigen Prozess mit 5 Threads zu Abend essen können. In diesem Fall müssen Sie einen Mutex und keinen Semaphor verwenden. Sie können jedoch nicht Bedingung verwenden oder nicht. Es hängt davon ab, was genau und wie genau Sie dieses Ess-Verfahren implementieren möchten.

Ich bin nicht sicher, wie ich es besser beschreiben soll, da ich am Ende ein Buch darüber schreiben werde. Daher würde ich empfehlen, ein Buch zu finden, das bereits geschrieben wurde, um die grundlegenden Konzepte zu verstehen. Sobald Sie die Grundlagen kennen, können Sie APIs / Bibliotheken / Frameworks wie POSIX-Threads verwenden, Boost Interprocess oder Thread , ACE oder sogar nicht blockierende Algorithmen , um zu erreichen, was Sie wollen.

Viel Glück!

    
user405725 13.10.2010, 23:28
quelle
21

Dies ist eine Möglichkeit, einen sehr einfachen Semaphor mit Boost.Thread zu implementieren. Es ist ein Inter-Thread-Semaphor, kein Interprozess-Semaphor. Keine Garantien impliziert usw. - Ich habe den Code nicht einmal kompiliert. Es veranschaulicht, wie Mutexe und Bedingungsvariablen interagieren, und nimmt eine einigermaßen aktuelle Version von Boost an.

Beachten Sie, dass die Mutex- und die Bedingungsvariable "gepaart" sind - Threads müssen eine Sperre für den Mutex haben, um auf die Bedingungsvariable zu warten und die Sperre erneut zu erhalten, wenn sie aufgeweckt werden. Außerdem muss der Code, der die Daten ändert, explizit anderen Code aktivieren, der möglicherweise wartet. Dies bedeutet, dass der Mutex, die Zustandsvariable, die Daten und die Bedingung (en), die das Aufwecken verursachen, eng miteinander gekoppelt sind. Die enge Kopplung bedeutet auch, dass die Daten, der Mutex und die Zustandsvariable wenn möglich verkapselt werden sollten - jede externe Modifikation kann den Code auf seltsame Weise brechen, einschließlich Deadlocks, verpassten Wakeups und anderen seltsamen Fehlern.

All dies ist wirklich als Ergänzung zu Vlad Lazarenkos Antwort gedacht - das Verständnis der Theorie und der Prinzipien ist mindestens so wichtig wie der "Arbeits" -Code in Multi-Thread-Programmierung.

%Vor%     
Doug 14.10.2010 03:29
quelle
0

Ich habe eine Semaphor-Klasse mit Boosts TimedLockable concept kompatibel gemacht, also kann sie mit Locks wie boost::unique_lock<semaphore> verwendet werden. Es ist kein Semaphor in einer klassischen Definition von Eins, sondern kann als Eins verwendet werden. Trotzdem hoffe ich, dass es für jemanden nützlich sein kann.

Es ist irgendwie getestet, aber es gibt eine große Möglichkeit, dass ich etwas falsch gemacht habe. Wäre toll, wenn jemand es auf Richtigkeit überprüfen könnte.

%Vor%     
Vasilly.Prokopyev 19.03.2015 08:52
quelle