Page 18 -
P. 18
좀 더 구체적으로 설명하면, C++11에서 처음으로 메모리 모델과 어토믹 변수가 도입됐다. 둘 다
멀티스레딩 프로그래밍에서 잘 정의된 동작(well-defined behavior)의 토대가 된다.
C++에 새로 추가된 스레드로 원하는 작업을 실행시킬 수 있다. 스레드는 포그라운드나 백그라운
드에서 구동할 수 있고, 복제나 레퍼런스 방식으로 데이터를 받을 수 있다.
스레드 사이의 공유 변수에 대한 접근 연산은 잘 다뤄야 한다. 이러한 제어 작업은 뮤텍스(mutex)나
락(lock)(잠금 장치)을 이용해 다양한 방식으로 처리할 수 있지만, 데이터를 초기화하는 부분을 보
호하는 것만으로도 전체 수명 동안 불변 상태를 유지하기 때문에 이 정도로 충분한 경우가 많다.
변수를 스레드-로컬(thread-local)로 선언하면 스레드는 그 변수의 복제본을 받아오기 때문에 충돌
이 발생하지 않는다.
상태 변수(condition variable)는 송신자-수신자(sender-receiver) 워크플로를 구현하기 위한 전통적
인 기법이다. 그 핵심 개념을 한마디로 표현하면, 송신자가 수신자에게 작업이 끝났다고 알려주면
수신자는 작업을 시작하는 것이다.
태스크는 스레드와 비슷한 점이 많다. 그러나 스레드는 프로그래머가 직접 생성하는 데 반해, 태
스크는 C++ 런타임이 내부적으로 생성한다. 태스크는 데이터 채널과 비슷하다. 데이터 채널에
데이터를 넣어 두면, 나중에 그 값을 가져가는 방식으로 작동한다. 여기서 데이터는 값일 수도 있
고, 익셉션이나 알림일 수도 있다.
1.3 라이브러리 활용 C++ STANDARD LIBRARY
라이브러리를 사용하는 과정은 세 단계로 구성된다. 첫째, #include로 헤더 파일을 추가(인클루드
(include), 불러오기)해야 한다. 그래야 어느 라이브러리를 사용하는지 컴파일러가 알 수 있다. 둘
째, C++ 표준 라이브러리 이름은 std 네임스페이스에 있기 때문에 긴 이름(fully qualified name)으
로 지정하거나 글로벌 네임스페이스로 불러와야 한다. 셋째, 실행 파일을 생성하기 위해 링커에게
라이브러리를 알려줘야 한다. 이 단계는 생략해도 되는 경우가 많다. 그럼 세 단계를 하나씩 자세
히 살펴보자.
34
c++_06.indd 34 2021-11-19 오전 9:25:43