Trip Report: Ad-Hoc Meeting on Threads in C++
C++의 스펙에서는 멀티 쓰레딩을 생각하지 않았으며, 이로 인해 C++의 문법들은 멀티 쓰레딩 자체와는 무관합니다. 따라서 많은 분들이 오해를 하시는데, volatile과 멀티쓰레딩도 관계가 없습니다. volatile은 C++문법에 의해 규정되었고, C++에서 쓰레딩이란 없다…는 거죠.
아무튼, 그래서 C++에서의 쓰레딩에 대한 논의가 진행중인가 봅니다. 글 중에 재미있는 예는 다음과 같이 2개의 쓰레드가 별도로 돌고 있을때,
Thread 1
y = 1;
r1 = x;
Thread 2
x = 1;
r2 = y;
x, y 의 초기값이 0이라면 이 프로그램이 수행 종료시 r1 = r2 = 0이 가능한가라는 내용입니다. 컴파일러는 속도를 위해 semantic을 해치지 않는 범위에서 할당을 reordering할 수 있으며, MMU도 같은 일을 할 수 있습니다. 따라서 위의 쓰레드는
Thread 1
r1 = x;
y = 1;
Thread 2
r2 = y;
x = 1;
이런식으로 재배치될 수 있고, 이 경우 r1 = r2 = 0이 됩니다. 문제는 이 할당문들이 atomic 일때 reordering을 어떻게 제한하는가 하는 것인데, Hans 라는 분은 심지어 할당문들이 atomic write라고 할지라도 reordering되는 안을 제안했나 봅니다.
자바의 경우에는 atomic write라는게 사실 없었지만 (원래 volatile이라는 키워드는 JAVA의 초기부터 존재하였으나 아무도 제대로 구현하지 않았습니다. 심지어 썬도.) volatile의 의미를 좀더 강력하게 지정하게되면서 atomic 간에 서로 넘나들지 못하게 규정하였습니다. 따라서 자바라면 atomic write에서는 위에처럼은 재배치 안되죠. 심지어 자바에선 atomic 이 아닌 read/write가 atomic read/write를 넘나들지 못합니다. 이를 통해 성능을 희생하였지만, 정확하게 프로그래밍을 하기 쉽게 된 것이죠..
반면 C++의 스펙이 만약 Hans의 안대로 수정된다면 상당히 어려운 concurrency의 세계가 열릴 듯 합니다. 이런 스펙 proposal만 보아도, C/C++가 프로그래머에게 더 많은 자유와 권한을 부여하는 전통이 여전히 내려오고 있는 듯 합니다.