handleRequest(string key)
에 대한 함수 호출의 형태로 요청을 처리하는 다중 스레드 C++ 프로그램이 있다고 가정 해 보겠습니다. handleRequest
에 대한 각 호출은 별도의 스레드에서 발생하며 임의로 많은 수의 가능한 값이 key
에 있습니다.C++에서 임의의 문자열을 잠금으로 사용하려면 어떻게해야합니까?
나는 다음과 같은 동작을합니다 : 그들은 key
에 대해 동일한 값을 가질 때 handleRequest(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 만 만들 수 있습니다. 리눅스에서 적어도 얼마나 많은 것을 바꿀 수는 있지만,이 방법을 사용하여 오래된 Mutexes를 가비지 수집하는 것에주의해야합니다. –