Lock을 잡는 scope는 최소화 해야 하는 것은 잘 알고 있을 것이다.

swap을 활용하면 더 좋다는 것에 대해서 이야기 해보려고 한다.

개발을 하다보면 map을 만들어 놓고 객체를 등록하고, 찾고, 제거하는 일을 많이 하게 된다.

예를 들어 다음과 같은 Manager class를 만들어 사용한다고 하자

 

만약 Manager가 멀티쓰레드 환경에서 thread safe해져야 한다면,

lock free container를 도입하거나,

lock을 사용 해야 한다.

만약 lock을 사용한다면 …

보통 이렇게 할 것이다.

하지만, Remove함수에서 좀 더 최적화를 할 수 있는 여지가 남아있는데…

Remove 함수에서 lock을 잡은 후에 일어나는 일을 먼저 살펴 보면

1. _cont에서 id에 해당하는 node를 찾아서 지운다.
2. Foo의 소멸자가 호출되고, 메모리 해제가 된다.

1번의 과정은 정확히 lock이 필요하지만, 2번의 과정은 lock이 과정이 없어도 된다.
(여기서 Manager class의 lock은 map을 보호하는 것이지 class Foo 를 보호하는 것이 아님)

이 문제는 다음과 같이 swap을 활용하면 해결 할 수 있다.

뭔가 코드의 줄 수는 늘어나서 좋지 않아보이지만, 분명히 최적화는 되었다.

만약 Clear함수를 만든다면….

Clear() 보다 Clear2()가 코드 줄수는 조금 더 길지만, 최적화 되었다.