[Philosophers] thread란?

J_JEON·2022년 8월 29일
0

Philosophers

목록 보기
2/5

Thread란

하나의 프로그램이 돌아가는 프로세스 내에서 실행되는 여러개의 흐름 단위이며,
하나의 프로세스내에서 여러개의 스레드가 돌아가며 여러가지 일을 동시에 수행하는 것 처럼 보임
여러개의 프로세스가 동시에 실행되는 멀티태스킹보다 문맥교환의 속도가 빨라 작업 전환의 속도를 절약하여 더 빠르게 실행할 수 있음

pthread란

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);
    1. 첫 인자 = pthread 식별자로 스레드가 성공적으로 생성되면 스레드 식별값이 주어짐
    2. 두번째 인자 = 스레드 속성으로 기본 옵션 사용시 NULL
    3. 세번째 인자 = 스레드가 실행될 시 시작될 함수, 이 함수 내에서 sleep실행시 다른 스레드가 돌아감
    4. 네번째 인자 = 함수에 보낼 파라미터
      pthread_create를 사용해 스레드를 생성할 수 있음
  • pthread_join()

    int pthread_join( pthread_t th_id, void** thread_return );
    1. 첫 번째 인자 = 어떤 pthread를 기다릴 지 정하는 식별자
    2. 두 번째 인자 = pthread의 return 값, 포인터로 값을 받아옴
      특정 pthread가 종료될 때까지 기다리다 종료시 자원을 해제시켜 줌.
      join이후 실행되는것들은 해당 pthread가 종료되고 난 이후에 실행됨
  • pthread_detach()

    int pthread_detach*(pthread_t th_id);
    1. 첫 번째 인자 = 어떤 pthread를 기다릴 지 정하는 식별자
      특정 pthread가 종료될 때 자원을 해제시켜 줌.
      detach이후 실행되는것은 join과 다르게 곧바로 실행됨
  • pthread_self()

    pthread_t pthread_self(void); 

    현재 사용중인 pthread의 식별자를 반환함

test예제

#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이 동시에 실행되는 예제

profile
늅늅

0개의 댓글