현생/TCP 소켓 프로그래밍

18-2. 쓰레드의 생성과 실행방법 [C][LINUX]

푸더기 2022. 2. 16. 23:05
반응형

 

쓰레드는 별도의 실행흐름을 가지기에 쓰레드만의 main 함수가 필요합니다. 그리고 이 함수를 시작으로 별도의 실행흐름을 형성해 줄 것을 운영체제에게 요청해야 합니다.

 

#include<pthread.h>

int pthread_create(
	pthread_t * restrict thread,
    const pthread_attr_t *restrict attr,
    void *(*start_routine)(void*),
    void *restrict arg
);
//success: 0  fail: 0을 제외한 값
thread: 생성할 쓰레드의 ID 저장을 위한 변수의 주소 값
attr: 쓰레드에 부여할 특성 정보의 전달을 위한 매개변수로, 기본적인 쓰레드 생성 시 NULL 전달
start_routine: 쓰레드의 main 함수 포인터
arg: start_routine 인자의 함수가 호출될 때 전달할 인자의 정보를 담고 있는 변수의 주소 값

위 함수를 통해 쓰레드를 생성할 수 있습니다.  (키워드 restrict는 특정 메모리에 접근할 수 있는 포인터가 단 한 개라는 의미의 명시적 제약입니다.)

 

#include<unistd.h>
#include<stdio.h>
#include<pthread.h>
void * thread_main(void *arg);

int main(int argc, char *argv[]){
	pthread_t t_id;
	int thread_param=5;
	if(pthread_create(&t_id, NULL, thread_main, (void*)&thread_param)!=0){
		puts("pthread_create() error");
		return -1;
	}
	sleep(10);
	puts("end of main");
	return 0;
}

void* thread_main(void *arg){
	int i;
	int cnt=*((int*)arg);
	for(i=0; i<cnt; i++){
		sleep(1);
		puts("running thread");
	}
	return NULL;
}

쓰레드 생성의 예제코드입니다. 컴파일 할 때 -lpthread 옵션을 넣어줘야 합니다.

main함수가 종료되면 프로세스가 소멸됨에 따라 쓰레드 또한 종료되게 되는데 이를 방지하기 위해 sleep 함수를 호출했습니다. 하지만 실전에서 sleep 함수로 쓰레드 실행을 관리하기엔 무리가 따릅니다.

 

#include<pthread.h>

int pthread_join(pthread_t thread, void ** status);
//success:0  fail: 0 이외의 값

thread 매개변수에 전달된 ID의 쓰레드가 종료될 때까지 함수는 반환되지 않습니다. 또, status에는 쓰레드의 main 함수가 반환하는 값이 저장될 포인터 변수의 값을 전달합니다. 다만 pthread_join 함수를 사용하게 되면 블로킹 상태에 놓이게 됩니다.

#include<pthread.h>

int pthread_detach(pthread_t thread);
//success:0  fail:0 이외의 값

위 함수를 사용하면 thread 매개변수에 전달된 ID의 쓰레드가 종료와 동시에 소멸됩니다. 블로킹 상태에 놓이지도 않습니다. 단, 이 함수가 호출된 이후 pthread_join 함수를 사용할 수 없습니다.

반응형