假設我有一個多線程的C++程序,它以函數調用handleRequest(string key)
的形式處理請求。對handleRequest
的每次調用都發生在一個單獨的線程中,並且key
有任意數量的可能值。如何在C++中使用任意字符串作爲鎖?
我想以下行爲:
- 到
handleRequest(key)
同時呼叫被序列化時,他們有key
相同的值。 - 全局序列化被最小化。
的handleRequest
的身體可能是這樣的:
void handleRequest(string key) {
KeyLock lock(key);
// Handle the request.
}
問:我將如何實現KeyLock
以獲得必要的行爲?
一個幼稚的做法是這樣開始:
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.
}
...但是這需要在開始一個全局鎖和每個請求的結束,和一個單獨的Lock
對象爲每個請求的創建。如果在調用handleRequest
之間的爭用較高,這可能不成問題,但如果爭用率較低,則可能會產生大量開銷。
通常只能創建如此多的名爲Mutexes。在Linux上,至少你可以改變你得到的數量,但我會提防使用這種方法來垃圾收集舊的Mutexes。 – 2008-10-03 21:23:30