Angenommen, ich habe ein Multithread-C++ - Programm, das Anfragen in Form eines Funktionsaufrufs an handleRequest(string key)
behandelt. Jeder Aufruf an handleRequest
erfolgt in einem separaten Thread, und es gibt eine beliebig große Anzahl möglicher Werte für key
.Wie verwende ich eine beliebige Zeichenfolge als Sperre in C++?
Ich möchte folgendes Verhalten:
- gleichzeitige Anrufe
handleRequest(key)
serialisiert, wenn sie den gleichen Wert fürkey
haben. - Die globale Serialisierung ist minimiert.
Der Körper handleRequest
könnte wie folgt aussehen:
void handleRequest(string key) {
KeyLock lock(key);
// Handle the request.
}
Frage: Wie würde ich KeyLock
implementieren das erforderliche Verhalten zu bekommen?
könnte eine naive Implementierung wie folgt beginnen:
KeyLock::KeyLock(string key) {
global_lock->Lock();
internal_lock_ = global_key_map[key];
if (internal_lock_ == NULL) {
internal_lock_ = new Lock();
global_key_map[key] = internal_lock_;
}
global_lock->Unlock();
internal_lock_->Lock();
}
KeyLock::~KeyLock() {
internal_lock_->Unlock();
// Remove internal_lock_ from global_key_map iff no other threads are waiting for it.
}
... aber das erfordert eine globale Sperre am Anfang und am Ende jeder Anfrage, und die Schaffung eines separaten Lock
Objekt für jede Anforderung. Wenn der Konflikt zwischen den Aufrufen an handleRequest
hoch ist, ist das möglicherweise kein Problem, aber es kann viel Overhead verursachen, wenn die Konkurrenz gering ist.
Normalerweise können nur so viele benannte Mutexes erstellt werden. Unter Linux können Sie zumindest ändern, wie viele Sie bekommen, aber ich würde aufpassen, diese Methode mit etwas zu verwenden, um alte Mutexes zu sammeln. –