더북(TheBook)

이 프로그램은 일단 크래시는 일으키지 않을 것입니다. 그러나 리스트 자료 구조인 list에 실제로 들어 있는 항목 개수와 리스트의 항목 개수를 의미하는 변수 listCount는 항상 일치하지 않을 수 있다는 문제가 있습니다.

변수 list에 변화를 가하는 동안에는 listCount가 잠금 상태가 아니기 때문에, 다른 스레드에서 listCount를 읽거나 쓸 수 있습니다. 또 listCount를 변경하는 동안에도 다른 스레드가 list를 변경할 수 있습니다. 다만 listMutex가 보호하기 때문에 변수 list와 그 안에 들어 있는 각 항목들의 상태가 도중에 훼손되는 일은 없습니다. 하지만 listMutex는 보호 대상에서 제외됩니다.

다시 말해서 listlistMutex는 같이 맞물려 돌아가야 하는 변수인데, 즉 일관성이 유지되어야 하는데 잠금 객체 2개 때문에 일관성이 유지되지 못합니다. 이때 해결 방법은 listlistMutex를 한 뮤텍스나 임계 영역으로 보호해야 하는 것입니다.

이러한 실수를 자신도 모르게 할 때가 있습니다. 원자 조작이나 병렬 자료 구조를 사용할 때입니다.10 원자 조작이나 병렬 자료 구조는 여러 스레드가 동시에 접근해도 항상 안전한 상태를 유지합니다. 그러나 이것을 맹신한 나머지 앞서 말한 일관성 규칙을 깨는 실수를 할 때가 있습니다.

 

10 병렬 자료 구조를 제공하는 라이브러리로는 Intel Thread Building Blocks나 Visual C++, C#의 Parallel Container 등이 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.