이미 소장하고 있다면 판매해 보세요.
|
PART I 서론 _ 1
CHAPTER 1 모던 C++의 동시성 3 C++11과 C++14: 토대 4 메모리 모델 4 멀티스레딩 5 사례 연구 7 벡터의 합 계산하기 7 싱글턴의 스레드 안전한 초기화 7 CppMem의 연속 최적화 7 C++17: 표준 템플릿 라이브러리의 병렬 알고리즘 8 실행 정책 8 새 알고리즘들 8 C++20: 동시성 퓨처 9 원자계 스마트 포인터 9 확장 퓨처 10 래치와 장벽 10 코루틴 10 트랜잭션 메모리 10 태스크 블록 11 도전 11 베스트 프랙티스 11 time 라이브러리 12 용어 12 PART II 본론 _ 13 CHAPTER 2 메모리 모델 15 계약 16 기반 17 도전 18 원자계 19 꼼꼼한 메모리 모델 vs 허술한 메모리 모델 19 원자계 플래그 22 클래스 템플릿 std::atomic 27 사용자 정의 원자계 34 원자계 연산들 35 원자계 자유 함수들 36 동기화 및 순서상 제약 조건 39 C++의 여섯 가지 메모리 모델 39 시퀀스 일관성 41 acquire-release 시맨틱 44 std::memory_order_consume 53 편안한 시맨틱 57 담장 60 메모리 장벽으로서의 담장 60 세 가지 담장 60 acquire 담장과 release 담장 63 원자계 변수의 동기화와 담장의 동기화 65 CHAPTER 3 멀티스레딩 71 스레드 72 생성 72 라이프사이클 73 인수 76 메서드 80 공유 데이터 83 뮤텍스 85 잠김 90 스레드 안전한 초기화 100 스레드 로컬 데이터 106 조건 변수 108 wait 작업 흐름 110 사라진 깨우기와 가짜 깨우기 112 태스크 112 스레드와 태스크 113 std::async 115 std::packaged_task 120 std::promise와 std::future 124 CHAPTER 4 사례 연구 135 벡터의 합 계산하기 136 벡터의 싱글스레딩 덧셈 137 공유 변수의 멀티스레딩 합 143 스레드 로컬 합 148 벡터의 합: 결론 157 싱글턴의 스레드 안전한 초기화 158 잠김 패턴의 이중 확인 159 성능 측정 160 스레드 안전한 마이어스 싱글턴 163 std::once_flag와 결합된 std::call_once 166 원자계 167 스레드 안전한 싱글턴 구현의 성능 수치들 170 CppMem 연속 최적화 171 CppMem 개요 172 CppMem: 비원자계 변수 176 CppMem: 잠김 180 CppMem: 시퀀스 일관성 원자계 182 CppMem: acquire-release 시맨틱 원자계 187 CppMem: 비원자계가 적용된 원자계 190 CppMem: 편안한 시맨틱 원자계 192 결론 194 CHAPTER 5 표준 템플릿 라이브러리의 병렬 알고리즘 195 실행 정책 196 알고리즘 198 새 알고리즘들 199 함수형 유산 203 CHAPTER 6 미래: C++20 205 원자계 스마트 포인터 206 스레드 안전한 단일 연결 리스트 207 확장 퓨처 208 std::future 208 std::async, std::packaged_task, std::promise 210 새 퓨처 생성하기 210 래치와 장벽 213 std::latch 214 std::barrier 214 std::flex_barrier 216 코루틴 217 제너레이터 함수 218 세부 내용 221 트랜잭션 메모리 223 ACI(D) 224 동기화 블록과 원자계 블록 224 transaction_safe 코드와 transaction_unsafe 코드 228 태스크 블록 229 fork와 join 229 define_task_block과 define_task_block_restore_thread 231 인터페이스 231 스케줄러 232 PART III 심화 _ 233 CHAPTER 7 도전 235 ABA 236 비유 236 비임계 ABA 237 잠김 없는 데이터 구조 237 ABA 문제 238 해결책 239 블로킹 문제 241 프로그램 불변식 깨기 243 데이터 경쟁 244 가짜 공유 246 변수의 라이프사이클 문제 246 움직이는 스레드 247 교착상태 249 경쟁 상태 250 CHAPTER 8 베스트 프랙티스 251 개괄 252 코드 리뷰 252 변형 가능한 데이터의 데이터 공유를 최소화하라 252 대기를 최소화하라 253 변형 불가능한 데이터를 먼저 사용하라 253 올바른 추상화를 찾아라 253 정적 코드 분석 도구를 사용하라 254 동적 강화 도구를 사용하라 254 메모리 모델 255 동기화에 volatile을 사용하지 마라 255 잠김 없는 프로그램을 만들지 마라 256 잠김 없는 프로그램이 불가피할 때는 잘 정립된 패턴을 사용하라 256 자신만의 추상화를 만들지 말고 언어가 제공하는 보장을 사용하라 256 멀티스레딩 257 스레드 257 데이터 공유 259 조건 변수 262 프로미스와 퓨처 265 CHAPTER 9 time 라이브러리 267 시점과 기간, 클록의 상호작용 268 시점 269 시점에서 캘린더 시간까지 269 유효한 시간 범위를 넘어 271 기간 272 계산 274 클록 276 정확도와 고정성 277 에포크 279 잠자기와 기다리기 281 관습 281 다양한 기다리기 전략 282 CHAPTER 10 용어 287 찾아보기 295 |
Rainer Grimm
라이너 그림의 다른 상품
배장열의 다른 상품
|
C++의 동시성이 생소한 독자는 큰 그림을 그리기 위해 서론부터 읽어야 할 것이다. 큰 그림을 그렸다면 본론으로 나아갈 준비는 끝난 셈이다. 이 책을 처음 읽을 때는 궁금한 나머지 직접 살펴봐야겠다고 생각하지 않은 이상 메모리 모델을 건너뛰는 것이 좋다. 사례 연구는 메모리 모델을 기본적으로 이해하고 있어야 생각할 수 있을 만큼 어려운 이론을 실제로 적용하는 데 도움이 될 것이다.
--- p.xv 지금부터는 기본 빌딩 블록이었던 std::atomic--- p.flag에서 고급 원자계로 한 걸음 더 들어가 보자. 살펴볼 대상은 std::atomic이라는 클래스 템플릿이다. 불(bool)이나 정수 관련 타입, 포인터를 위한 부분 및 전체 특수화는 std::atomic--- p.flag보다 더욱더 강력한 인터페이스를 제공한다. 반면, 단점은 이 특수화가 잠김 없음(lock-free)을 보장하지 않는다는 것이다. --- p.27 변형 가능한(mutable) 공유 데이터는 데이터 경쟁(data race)에 취약하므로 동기화만 생각하는 것이 상황을 깔끔하게 정리하는 지름길이다. 비동기 읽기나 쓰기를 데이터에 동시에 수행하면 프로그램은 정의되지 않은 동작을 보인다. --- p.83 성능 수치 자체에 너무 매달리지 않는 것이 좋다. 리눅스와 윈도우에서 알고리즘을 달리한 결과 수치는 그렇게 큰 의미가 없다. 그보다는 어느 알고리즘이 동작하고 어느 알고리즘이 동작하지 않는지 추측할 수 있는 일종의 촉을 가지는 것이 중요하다. 여기서는 리눅스 데스크톱의 성능 수치를 절대적인 기준으로 윈도우 랩톱과 비교하는 일은 없을 것이다. 다만, 어떤 알고리즘이 리눅스나 윈도우에서 더 나은 성능을 보이는지 판단하는 척도로서만 생각할 것이다. --- p.136 작은 프로그램으로 시작해 조금씩 개선해 나간 것이 대단히 바람직했다. 먼저, 각 단계마다 스레드의 교차 실행을 늘릴 수 있다. 그렇게 하면 x와 y의 값도 더 많아질 것이다. 그다음으로, 프로그램의 난도가 높아진다. 작은 프로그램이지만 CppMem은 매우 중요한 서비스를 제공한다. --- p.194 |