하나의 프로그램이 돌아가는 프로세스 내에서 실행되는 여러개의 흐름 단위이며,
하나의 프로세스내에서 여러개의 스레드가 돌아가며 여러가지 일을 동시에 수행하는 것 처럼 보임
여러개의 프로세스가 동시에 실행되는 멀티태스킹보다 문맥교환의 속도가 빨라 작업 전환의 속도를 절약하여 더 빠르게 실행할 수 있음
POSIX thread의 약자로 유닉스계열 POSIX시스템에서 스레드를 편하게 만들 수 있도록 하는 API이다
- <pthread.h> 헤더를 include하여 사용할 수 있다
pthread_create()
int pthread_create(pthread_t*thread, const pthread_attr_t*attr,\\ void*(*start_routine)(void *), void *arg);
- 첫 인자 = pthread 식별자로 스레드가 성공적으로 생성되면 스레드 식별값이 주어짐
- 두번째 인자 = 스레드 속성으로 기본 옵션 사용시 NULL
- 세번째 인자 = 스레드가 실행될 시 시작될 함수, 이 함수 내에서 sleep실행시 다른 스레드가 돌아감
- 네번째 인자 = 함수에 보낼 파라미터
pthread_create를 사용해 스레드를 생성할 수 있음pthread_join()
int pthread_join( pthread_t th_id, void** thread_return );
- 첫 번째 인자 = 어떤 pthread를 기다릴 지 정하는 식별자
- 두 번째 인자 = pthread의 return 값, 포인터로 값을 받아옴
특정 pthread가 종료될 때까지 기다리다 종료시 자원을 해제시켜 줌.
join이후 실행되는것들은 해당 pthread가 종료되고 난 이후에 실행됨pthread_detach()
int pthread_detach*(pthread_t th_id);
- 첫 번째 인자 = 어떤 pthread를 기다릴 지 정하는 식별자
특정 pthread가 종료될 때 자원을 해제시켜 줌.
detach이후 실행되는것은 join과 다르게 곧바로 실행됨pthread_self()
pthread_t pthread_self(void);
현재 사용중인 pthread의 식별자를 반환함
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/time.h> long long ft_get_time(void) { long long sec; struct timeval time; // 현재 초와 마이크로초를 저장할 구조체 gettimeofday(&time, NULL); // 현재 초와 마이크로초를 각각 반환하여 time구조체에 받아옴 sec = (time.tv_sec * 1000) + (time.tv_usec / 1000); // 초 * 1000 + 마이크로초 / 1000 = 밀리초 return (sec); } void *print_thread(void *str) { pthread_t tid; int i; > tid = pthread_self(); i = 0; while (i < 10) { printf("%s %x call time : %lld\n", (char*)str, (unsigned int)tid ,ft_get_time()); // 현재 스레드의 스레드id와 밀리초를 구하여 출력 usleep(1000 * 1000); // 1000 마이크로초만큼 sleep해줌 i++; } return (0); } int main() { char t1[] = "thread1"; char t2[] = "thread2"; char t3[] = "thread3"; int ret; pthread_t tid[3]; // 스레드를 구분하는 tid를 저장할 pthread_t pthread_create(&tid[0], NULL, print_thread, (void *)t1); // 스레드1 생성 pthread_join(tid[0], NULL); // 스레드1 종료대기 후 자원회수 pthread_create(&tid[1], NULL, print_thread, (void *)t2); // 스레드1 종료 후 스레드2 생성 pthread_detach(tid[1]); // 스레드2 종료시 자원회수 pthread_create(&tid[2], NULL, print_thread, (void *)t3); // 스레드2 종료를 기다리지않고 바로 스레드3 생성 pthread_join(tid[2], NULL); // 스레드3 종료대기 후 자원회수 return (0); }
스레드1이 시작되고 종료되면 스레드2와 3이 동시에 실행되는 예제