12
Effective Modern C++ Study C++ Korea 발표자 : 윤석준

[C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Embed Size (px)

Citation preview

Page 1: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea

발표자 : 윤석준

Page 2: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준
Page 3: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 3

std::atomic<int> A(0);

A = 10;

std::cout << A;

++A;

--A;

std::atomic<T>은 다른 Thread로부터 atomic 하게 작업하는 것을 보장

mutex와 비슷하지만 lock-free로 동작 가능 (컴파일러에 따라 다름)

다른 Thread에서 A를 읽을 때 0, 10, 11 값 중 하나

RMW 연산 (Read-Modify-Write) 및 모든 member function은

multi-thread 환경에서 atomic 동작

Page 4: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 4

volatile int V(0);

A = 10;

std::cout << A;

++A;

--A;

다른 Thread에서 값을 읽을 때 아무 것도 보장해 주지 않는다.

경쟁 상태 (Data Race)가 발생 할 수 있다.

다른 Thread에서 A를 읽을 때 0, 10, 11 값이 아닐 수 있음

Page 5: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 5

std::atomic<int> x(0);

std::atomic<int> y(x.load());

y.store(x.load());

COPY 연산자가 없다.

std::atomic<T>에 대한 MOVE 생성자, 연산자도 없다.

값을 다른 곳으로 전달하기 위해서는 load() 와 store() 함수를 이용한다.

std::atomic<T>에 대해서 값을 읽고 쓰는 동작은 load() 와 store() 함수를 이용하자. (그러면 소스코드상에서 std::atomic<T>와 일반 변수를 구별하기 쉬워진다.)

Page 6: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 6

Code Reorder

a = b;x = y;

x = y;

a = b;

Redundant loads Dead Stores

auto y = x; = x;

auto y = x;

x = 10;

Reordering은 Compile-time 뿐 아니라 Run-time에서 다른 Core에 할당도 가능하다.

Page 7: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 7

std::atomic<int>

Not Permitted

std::atomic<bool> isAvailable(false);

int Value = Func();

isAvailable = true;

volatile

Permitted

volatile isAvailable(false);

int Value = Func();

isAvailable = true;

volatile isAvailable(false);

isAvailable = true;

int Value = Func();

Page 8: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 8

std::atomic<int>

Permitted

auto y = x;y = x;

x = 10;

x = 20;

volatile

Not Permitted

auto y = x;

x = 20;

auto y = x;y = x;

x = 10;

x = 20;

Page 9: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 9

Normal Memory

• 값을 기록하면, 다른 값을 쓰기 전까지 유지된다.

• 값을 기록하고, 읽지 않은 상태에서 다른 값을 기

록하면 그 전에 값은 제거된다.

Special Memory

e.g. Memory mapping I/O

• 값을 기록하지 않아도 값이 변할 수 있다.

• 값을 기록하고, 읽지 않은 상태에서 다른 값을 기

록하더라도 그 두 값은 모두 의미가 있을 수 있다.

컴파일러에게 내가 바로 “Special Memory” 다.

라고 알려주는 방법은 ?

volatile

Page 10: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 10

std::atomic<int>

Concurrent Programming

volatile std::atomic<int> VA;

volatile

Special Memory

그렇다면 Special Memory를 Concurrent Programming에서 사용하고자 한다면 ???

Page 11: [C++ Korea] Effective Modern C++ Item 40 Use std::atomic for Concurrency, volatile for Special Memory. +윤석준

Effective Modern C++ Study C++ Korea 11

• std::atomic<T>은 Multi-Thread 환경에서 mutex를 사용하지 않고, data를 제어하는데 사용된다.

(즉, Concurrent Software를 위한 도구이다.)

• volatile 즉은 Read/Write 작업에 대해서 최적화를 하면 안 되는 data를 제어하는데 사용된다.

(즉, Special Memory를 위한 도구이다.)