/ / Mehrere Leser, Single-Writer-Sperre in Boost WITH Writer-Block - C ++, Multithreading, Boost, Mutex

Multiple-Reader, Single-Writer Sperre in Boost MIT Writer Block - C ++, Multithreading, Boost, Mutex

Die Antwort Hier fast macht was ich will

Ich möchte eine Lese-Schreibsperre, die Folgendes bewirkt:

  1. Erlauben Sie den Lesern, das Schloss zu nehmen, solange es keinen Schreiber gibt
  2. Wenn ein Writer die Sperre versucht, sperren Sie neue Leser aus, lassen Sie sie jedoch zu, lassen Sie alte Leser jedoch fertig, bevor Sie dem Writer die Sperre geben
  3. Sobald der Schreiber die Sperre aufhebt, lassen Sie neue Leser zu

Die oben genannte Implementierung erfüllt nicht die Kriterien (2). Es ermöglicht neuen Lesern, die Sperre zu ergreifen und den Schreiber zu blockieren, bis sie fertig sind.

Antworten:

2 für die Antwort № 1

Fand es. ich brauchte unique_lock Anstatt von upgrade_to_unique_lock:

boost::shared_mutex _access;
void reader()
{
// get shared access
boost::shared_lock<boost::shared_mutex> lock(_access);
}

void writer()
{
// wait for old shared access readers to finish
// but block out new shared access readers
boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
}

0 für die Antwort № 2

Aber hier hat Ihre "Writer" -Methode kein "Sperren" -Attribut. Meinen Sie damit, dass Sie vor dem "unique_lock" noch das "upgrade_lock" ausführen müssen? So etwas wie:

void writer()
{
// get upgradable access
boost::upgrade_lock<boost::shared_mutex> lock(_access);

// get exclusive access
boost::unique_lock<boost::shared_mutex> uniqueLock(lock);
// now we have exclusive access
}

Oder haben Sie Attribute gemischt und es sollte sein:

void writer()
{
boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
// now we have exclusive access
}