본문 바로가기

ComputerScience/Multi-core Computing

멀티코어컴퓨팅 - 8. Pthread Programming

728x90

process vs thread

너무 중요해서 한번 더 설명하겠다.

process는 독립된 메모리 공간을 갖기 때문에 각각 1000번지는 서로 다른 실제 메모리 주소를 갖는다.

반면 thread t1, t2 에서 1000번지라함은 서로 동일한 실제 메모리 공간을 나타낸다.

쓰레드는 프로세스보다 더 lightweight하다. 따라서 생성뿐만 아니라 쓰레드간 communication이 프로세스간 communication보다 부하가 적다.

 

Pthread

pthread는 unix 계열 환경에서 C언어로 사용할 수 있는 쓰레드 관련 함수들의 모음(라이브러리)이다.

일반적으로 리눅스같은 유닉스 계열 운영체제에서 많이 이용된다.

크게 세 카테고리로 함수를 분류할 수 있다.

 

1. Thread Management

- folk() 프로세스 생성

- pthread_create() : 쓰레드 생성

- pthread_exit : 현재 쓰레드 종료

- pthread_cancel : kill another thread

main thread가 종료되면 다른 모든 쓰레드도 자동으로 종료된다.

5개의 쓰레드가 각각 PrintHello를 실행한다. (void*)t는 PrintHello 함수의 매개변수이다.

쓰레드가 동작할 함수는 반드시 void* 타입으로 매개변수를 받아야 한다. 그 후 의도한 타입으로 캐스팅하여 사용한다.

참고로 pthread_create가 &threads[t]처럼 포인터 타입으로 매개변수를 전달하는 이유는 쓰레드 생성 후 값을 초기화하기 위함이다.

keyboard input을 메인 쓰레드가 받을때마다 쓰레드가 생성되어 입력받은 문자열을 일정 시간 주기로 출력한다.

마스터 쓰레드는 계속 열어볼 파일이름을 입력 받고 파일열기,읽어오기 동작을 새로운 워커쓰레드를 만들어 수행한다.

 

- pthread_join : 이 함수를 호출한 쓰레드가 인자로 넘겨준 쓰레드의 종료를 기다린다.

워커 쓰레드들이 다 종료되고 나서야 메인 쓰레드는 결과를 출력하고 프로그램을 종료한다.

한가지 특이한건 pthread_join(pthread_t thread, void **value_ptr)에서 더블포인터를 쓴다는 것이다.

포인터 타입으로 전달받은 변수를 수정하고 싶기 때문에 포인터를 하나 더 붙인 것이다.

즉 int* x가 있을때 x를 수정하고 싶어서 foo(&x_ptr)처럼 int** x_dptr로 전달하는 것이다.

 

2. Mutexes (mutual exclusion)

lock처럼 상호배제, 동기화 수행

- pthread_mutex_init : mutex 변수 초기화

- pthread_mutex_destroy : 변수 제거

- pthread_mutex_lock

- pthread_mutex_unlock

- pthread_mutex_trylock

총 네개의 쓰레드가 dotprod를 수행한다.

dotprod에서는 전역 변수로 선언된 mutexsum을 여러 쓰레드가 lock, unlock하며 공유해서 사용한다.

 

3. Conditional Variables

어떤 조건을 설정하고 thread끼리 notify(), wait()를 사용할 수 있다.

- pthread_cond_init

- pthread_cond_destroy

- pthread_cond_wait

- pthread_cond_signal

728x90
반응형