假设我有一个多线程 C++ 程序,它以函数调用的形式处理请求handleRequest(string key)
。每次调用都handleRequest
发生在一个单独的线程中,并且有任意大量的可能值key
。
我想要以下行为:
- 当对 的同时调用
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
,那可能不是问题,但如果争用很低,它可能会带来很多开销。