우리의 응용 프로그램에서는 작업 스레드에서 처리되고 표시 스레드에서 액세스되는 데이터를 처리하며 중요한 섹션을 처리하는 뮤텍스가 있습니다. 특별한 것은 없습니다.Guarded Data Design Pattern
이제 우리는 현재 잠금을 데이터 보유 및 처리 당사자가 명시 적으로 수행하는 코드를 다시 작업하는 방법에 대해 생각했습니다. 우리는 데이터를 보유하고 데이터에 대한 액세스 권한을 보호하는 단일 엔터티를 생각했습니다.
이를 위해 GuardedData라는 클래스가 있습니다. 호출자는 이러한 객체를 요청할 수 있으며 로컬 범위에서 잠시 동안 만 객체를 유지해야합니다. 객체가 살아있는 한 잠금을 유지합니다. 객체가 파괴 되 자마자 잠금 장치가 해제됩니다. 데이터 액세스는 호출자의 명시적인 추가 작업없이 잠금 메커니즘과 결합됩니다. 학급의 이름은 현재 경비병의 호출자를 상기시킨다.
template<typename T, typename Lockable>
class GuardedData {
GuardedData(T &d, Lockable &m) : data(d), guard(m) {}
boost::lock_guard<Lockable> guard;
T &data;
T &operator->() { return data; }
};
다시 말하면 매우 간단한 개념입니다. 연산자 -> 페이로드에 액세스하기 위해 STL 반복기의 의미를 모방합니다.
지금 궁금 :- 이 방법인가 잘 알려진?
- 이미 사용 가능한 템플릿 클래스가 있습니까? 예 : 부스트 라이브러리에?
나는 그것이 상당히 일반적이며 유용한 개념이라고 생각하기 때문에 묻습니다. 나는 그것을 좋아하지 않는 무엇이라도 발견 할 수 없었다.
포 그라운드에서 액세스되는 동안 백그라운드에서 변경할 수있는 데이터가 있습니다. 효과적으로 배경 계산이 끝나면 데이터가 바뀝니다. 이 스왑은 누군가가 데이터에 액세스하는 동안 발생해서는 안되며, 이로 인해 해당 당사자가 일관성없는 상태가 될 수 있습니다. 새 인스턴스를 만드는 대신 스왑을 수행해야하지만 다른 인스턴스는 여전히 이전 인스턴스를 사용합니다. 그 이유는 엄청난 양의 데이터가 동시에 메모리에 상주하기 때문입니다. – ypnos