pthread

pthread lifecycle 흐름

pthread 코드는 함수 포인터 하나로 끝나지 않는다. thread 함수에 넘기는 인자의 수명과 pthread_join 시점이 안전성을 결정한다.

01

인자 수명 보장

thread 함수가 읽을 구조체가 create 호출 뒤에도 살아 있어야 한다. 반복문 지역 변수 주소 전달은 위험하다.

02

종료 경로 결정

join할 thread인지 detach할 thread인지 생성 직후 정책을 정해야 resource leak을 막는다.

03

공유 데이터에 lock을 둔다

여러 pthread가 같은 counter나 queue를 바꾸면 mutex나 atomic이 필요하다.

시작 루틴
void* 함수 pthread 함수는 void* 인자를 받고 void*를 반환하는 형태다.
타입 변환을 좁게 둔다.
argument
수명 책임 스레드가 끝날 때까지 인자 객체가 파괴되지 않아야 한다.
heap 또는 배열에 안정적으로 둔다.
join
자원 회수 종료 상태와 스레드 자원을 회수한다.
join하지 않으면 누수가 생길 수 있다.
mutex
공유 상태 보호 critical section을 짧고 명확하게 만든다.
lock/unlock 짝을 확인한다.

인자 · 회수 · 공유 점검

인자 반복문 변수 하나의 주소를 모든 스레드에 넘기지 않는가.
회수 생성한 joinable thread를 모두 join하는가.
공유 thread 함수가 공유 데이터에 접근하는 모든 경로가 보호되는가.

인자 구조

struct Args { int id; Work* work; };
pthread_create(&tid, nullptr, worker, &args[i]);
pthread_join(tid, nullptr);