0

Ich habe ein Problem, wo ich eine Art shared/exclusive situationaußer haben das, was der gemeinsame Teil nicht wirklich geteilt werden muss: Ich werde versuchen zu erklären.shared/exclusive lock wo sollte die geteilte Arbeit nur einmal gemacht werden?

Das exklusive Teil ist einfach: Wenn die exklusive Sperre gehalten wird, sonst niemand erlaubt ist es, bis der Inhaber der exklusiven Sperre Mitteilungen für den Fortschritt.

Die (nicht wirklich) geteilt Arbeiter wie dies funktionieren sollte:

  • , wenn die exklusive Sperre gehalten wird, oder keine Sperre: (Warten auf exklusive freigegeben werden, und) „shared“ funktionieren .
  • wenn der „shared“ LOCK bereits gehalten wird, oder dies ist die zweite/n th „shared Arbeiter“ für die exklusive Sperre warten: Warten auf die Sperre geteilt (den ersten „shared Arbeiters“) zu freigegeben werden, aber dann nicht die Arbeit tun, aber nur zurück, weil der erste "geteilte Arbeiter" bereits nur den Job gemacht.

Gibt es einen Namen für dieses Schloss/Arbeitsmuster? Wenn es keinen Namen per se gibt, interessiert mich, ob das überhaupt verwendet wird/was ich geschrieben habe macht Sinn.

Antwort

0

Wenn Sie „Fertig“ Flagge/für die Arbeitseinheit und prüfen/einstellen, dass im Innern der exklusiven Sperre add - was Sie fehlen würden?

0

habe ich herausgefunden, dass dies nur ein zusätzliches (normal) Verriegelungs-/Mutex für die gemeinsamen Arbeiter:

Exclusive/Master:

  • shared_mutex.lock(); // or timed_lock(timeout)
    • tun Meisterwerk ...
    • Release exklusive Sperre

Arbeiter/Shared:

  • shared_mutex.lock_shared(); // or timed_lock_shared
    • gemeinsame Sperre erworben
    • if (worker_mutex.try_lock()) // normal mutex
      • Arbeiter Mutex gesperrt jetzt
      • Release arbeiten/Return
    • else if worker_mutex.try_lock() failed
      • ein anderer Arbeiter ist bereits im Gange
      • Warten auf die anderen Arbeiter zu beenden:
      • worker_mutex.lock() // or timed lock
        • Arbeiter Mutex erworben, andere Arbeiter fertig
        • nichts tun (Arbeit gerade getan wurde)
        • Release/Return

In meinem Fall die Leistung der das Ganze ist völlig irrelevant. Die exklusive Sperre wird in der Reihenfolge Sekunden gehalten und die gemeinsame Arbeit kann einige 100 ms dauern. Was dieses Schema verhindern soll, ist, dass mehrere "Clients" die (im Wesentlichen) gleiche Arbeit machen, wenn mehrere freigegebene "Clients" geteilt wurden, die auf die exklusive Sperre warten und freigegeben werden - nur ein "Client" wird dann die Arbeit machen und die anderen werden nur darauf warten, dass es fertig ist und zurückkehrt.

Ja, es ist ziemlich unordentlich, aber es ist ein Ansporn für eine bereits unordentliche Situation.


Hilfreiche C++ Klassen: