への関数呼び出しの形式で要求を処理するマルチスレッド 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
問題にならない可能性がありますが、競合が少ない場合は多くのオーバーヘッドが発生する可能性があります。