반응형
쓰레드는 별도의 실행흐름을 가지기에 쓰레드만의 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 함수를 사용할 수 없습니다.
반응형
'현생 > TCP 소켓 프로그래밍' 카테고리의 다른 글
18-4 쓰레드 동기화 - 뮤텍스 [C][LINUX] (0) | 2022.02.16 |
---|---|
18-3. 쓰레드의 임계영역, 동기화 [C][LINUX] (0) | 2022.02.16 |
18-1. 쓰레드란 무엇일까? (0) | 2022.02.16 |
17-2. 레벨 트리거와 엣지 트리거 [TCP/IP][C][LINUX] (0) | 2022.02.16 |
17-1. epoll 방식을 통한 IO 멀티플렉싱 [TCP/IP][C][LINUX] (0) | 2022.02.16 |