Summary
이 프로젝트에서는 프로세스 스레딩의 기본 사항을 배웁니다.
스레드를 만드는 방법을 배웁니다.
뮤텍스를 발견하게 될 것입니다.
'식사하는 철학자 문제'를 검색하면 많이 나온다.
memset
, printf
, malloc
, free
, write
,
usleep
, gettimeofday
,
pthread_create
,pthread_detach
, pthread_join
,
pthread_mutex_init
, pthread_mutex_destroy
, pthread_mutex_lock
, pthread_mutex_unlock
man pthread
POSIX 스레드는 프로세스 내에서 스레드라고 하는 여러 제어 흐름에 대한 요구 사항이 있는 응용 프로그램을 지원하는 함수 집합이다.
멀티 스레딩은 프로그램의 성능을 향상시키는 데 사용된다.
POSIX 스레드 함수는 이 섹션에서 다음 그룹으로 요약된다.
#include <pthread.h>
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
pthread_t *thread
const pthread_attr_t *attr
NULL
을 보낸다. 스레드의 특성을 지정하려면 pthread_attr_init()
등의 함수로 초기화해야 한다.void *(*start_routine)(void *)
void *arg
pthread_detach
int pthread_detach(pthread_t thread)
pthread_t thread
pthread_create()
만 사용하면 스레드가 끝나도 자원이 자동으로 해제되지 않는다. pthread_join()
을 같이 사용해야 자원이 해제된다.pthread_detach()
는 pthread_join()
을 사용하지 않아도 자동으로 자원을 해제한다.pthread_detach()
와 pthread_join()
을 동시에 사용할 수는 없다.pthread_join
int pthread_join(pthread_t thread, void **value_ptr)
pthread_t thread
void **value_ptr
pthread_create()
의 start_routine()
이 리턴하는 값을 넣는다.pthread_mutex_init
int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
pthread_mutex_t *mutex
const pthread_mutexattr_t *attr
NULL
을 보낸다.pthread_mutex_destroy
int pthread_mutex_destroy (pthread_mutex_t *mutex)
pthread_mutex_t *mutex
pthread_mutex_init()
으로 생성된 뮤텍스이다.pthread_mutex_lock
int pthread_mutex_lock (pthread_mutex_t *mutex)
pthread_mutex_t *mutex
pthread_mutex_unlock
int pthread_mutex_unlock (pthread_mutex_t *mutex)
pthread_mutex_t *mutex
pthread
함수를 사용한 코드를 컴파일 할 때는 다음과 같이 옵션을 넣어서 컴파일해야 한다.
gcc -g -pthread ...
usleep
#include <unistd.h>
int usleep(useconds_t microseconds);
useconds_t microseconds
gettimeofday
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
struct timeval *restrict tp
struct timeval
는 다음과 같다.struct timeval
{
time_t tv_sec; // seconds
suseconds_t tv_usec; // microseconds
};
void *restrict tzp
NULL
을 넣으면 된다.int main(void)
{
pthread_t th;
pthread_create(&th, NULL, &routine1, NULL);
printf("%ul\n", th);
pthread_join(th, NULL);
return (0);
}
이렇게 출력해보면 굉장히 큰 숫자가 나오는데, 이 숫자를 저 pthread
관련 함수들에서 스레드 식별자로 사용한다.
여기서는 unsigned long
으로 출력했지만, unsigned long long
이 될 수도 있고 int
, char
형이 될 수도 있다.
pthread_t
는 불투명한 데이터 유형으로 처리된다.
새로운 함수가 너무 많아서 힘들었다.
사실 이게 Day01이지만 프로세스와 스레드, 뮤텍스부터 공부했다.
저 함수들을 어떻게 사용하게 될지.. 막막하다.
참고한 사이트:
Happy Programmer~ :: C언어: pthread 기본 함수들
RAEKWON :: [리눅스] 스레드(Thread) 개념과 예제(pthread_create, pthread_join, pthread_detach)
Pthread API 레퍼런스
POSIX 스레드 <pthread.h> - - NEOS POSIX 함수 설명서
IT 개발자 Note :: usleep(3) - 설정된 micro초(microsecond: 100만분의 1초) 동안 대기
IT 개발자 Note :: gettimeofday(2) - micro초단위의 시간 얻기
Youtube CodeVault - What is pthread_t?