스레드 안전 컬렉션 (ThingList라고 함)이 있다고 가정하고 다음 함수를 추가하고 싶습니다. 객체를 것이다 해제/분명히스레드로부터 안전한 방법으로 포인터 반환
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
RAII 잠금 :
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
그러나 이렇게
, 나는 이런 식으로 뭔가를해야 할 것입니다 호출 코드에 대한 스레드 안전에 대한 책임을 위임했습니다 try/catch/unlocks를 단순화/제거 할 수 있지만 호출자가 잊어 버리기는 쉽습니다.내가 검토 한 결과 몇 가지 대안이 있습니다 대신 포인터의 값으로
- 반환 살아라 - 당신이 필요하지 않는 한 잘
- 기능
ThingList::setItemBar(string name, int value)
를 추가 것 수정 - 좋은, 그러나 이들은 경향이 있습니다 proliferate - 생성시 목록을 잠그고 파기시 다시 잠금을 해제하는 포인터와 같은 객체를 반환합니다. 이것이 좋은지 나쁜지 잘 모르겠다면 ...
이 문제를 해결하는 올바른 방법은 무엇입니까?
이 좋다 "병합"잠금 해제 후 안전하지만 것은 객체가 알고있는 숨겨진 가정이있다 방법 목록에 자신을 찾습니다. 병합하기 위해 "키"를 전달할 수는 있지만 삭제 된 항목을 병합하는 문제가 있습니다. – Roddy