Threading in C++

Tags:

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++가 프로그래머에게 더 많은 자유와 권한을 부여하는 전통이 여전히 내려오고 있는 듯 합니다.

Comments

2 responses to “Threading in C++”

  1. 이원구 Avatar

    저도 이글을 읽었었는데 느낌은 이런 토론이 이제 시작되서 과연 C++0x에 시간내에 포함될 수 있을까 좀 걱정이 되더군요.

    그래도 Hans, Herb 혹은 제3의 안이 채택되더라도 지금보다 어려워지진 않겠죠. 지금까진 어떤 guarantee도 없었으니 최소한 지금처럼만 코딩하면 문제는 없을테니까요.

    하지만 저 역시 Hans의 것은 너무 코딩이 어려워지지 않을까 하는 생각입니다. 차라리 guarantee가 아무것도 없는 지금이야 무조건 lock이라도 건다지만 atomic_read -> atomic_write는 order가 보장되고 atomic_write -> atomic_read는 보장이 안된다는 규칙은 지키기가 너무 어려울 것 같아요.

    이제 이런 규칙들이 정해지고 컴파일러들이 구현해서 내놓기 시작하면… lock-free 알고리즘들같은 것들이 힘을 받겠군요. 벌써부터 머리가… ㅠㅠ

  2. MKSeo Avatar
    MKSeo

    제가 보기엔 자바에서 끝난 논의를 참고할 수 있어 C++ 에서도 좋은 결론이 날거라 생각합니다. 딱 한가지 문제는 이 천문학적으로 어려운 언어가 더 어려워지지는 않을까 하는 것이죠;;;

Leave a Reply

Your email address will not be published. Required fields are marked *