Threads

스레드 실행과 공유 위험

한 프로세스 안의 스레드는 코드, heap, 파일 descriptor를 공유하지만 stack과 register 문맥은 따로 가진다. 공유가 빠른 만큼 race가 생긴다.

01

공유 자원 표시

두 스레드가 같은 변수나 자료구조를 읽고 쓰는지 먼저 찾는다.

02

각 스레드의 stack 구분

지역 변수는 보통 스레드별 stack에 있지만 포인터로 공유하면 다른 문제가 된다.

03

동기화 경계를 둔다

공유 상태를 바꾸는 구간에는 mutex, atomic, condition variable 같은 도구가 필요하다.

Concurrency
겹치는 진행 하나의 CPU에서도 실행 시간이 교차될 수 있다.
race는 병렬 CPU가 없어도 난다.
Parallelism
동시 실행 여러 core에서 실제로 동시에 실행된다.
속도 향상은 병목에 달렸다.
Stack
스레드별 호출 기록 함수 호출과 지역 변수가 스레드별로 분리된다.
stack 크기 제한을 본다.
Heap
공유 객체 동적 할당 객체는 모든 스레드가 포인터를 통해 접근할 수 있다.
소유권과 lock을 정한다.

공유 · 분리 · 보호 점검

공유 스레드들이 같은 데이터를 쓰는 지점을 모두 찾았는가.
분리 stack 지역 변수와 heap 공유 객체를 혼동하지 않는가.
보호 공유 상태의 불변식이 lock 없이 깨지지 않는가.

구분

process: code/data/heap/fd shared
thread: stack/register private