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_createint pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)pthread_t *threadconst pthread_attr_t *attrNULL을 보낸다. 스레드의 특성을 지정하려면 pthread_attr_init() 등의 함수로 초기화해야 한다.void *(*start_routine)(void *)void *argpthread_detachint pthread_detach(pthread_t thread)pthread_t threadpthread_create()만 사용하면 스레드가 끝나도 자원이 자동으로 해제되지 않는다. pthread_join()을 같이 사용해야 자원이 해제된다.pthread_detach()는 pthread_join()을 사용하지 않아도 자동으로 자원을 해제한다.pthread_detach()와 pthread_join()을 동시에 사용할 수는 없다.pthread_joinint pthread_join(pthread_t thread, void **value_ptr)pthread_t threadvoid **value_ptrpthread_create()의 start_routine()이 리턴하는 값을 넣는다.pthread_mutex_initint pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)pthread_mutex_t *mutexconst pthread_mutexattr_t *attrNULL을 보낸다.pthread_mutex_destroyint pthread_mutex_destroy (pthread_mutex_t *mutex)pthread_mutex_t *mutexpthread_mutex_init()으로 생성된 뮤텍스이다.pthread_mutex_lockint pthread_mutex_lock (pthread_mutex_t *mutex)pthread_mutex_t *mutexpthread_mutex_unlockint pthread_mutex_unlock (pthread_mutex_t *mutex)pthread_mutex_t *mutexpthread 함수를 사용한 코드를 컴파일 할 때는 다음과 같이 옵션을 넣어서 컴파일해야 한다.
gcc -g -pthread ...
usleep#include <unistd.h>int usleep(useconds_t microseconds);useconds_t microsecondsgettimeofday#include <sys/time.h>int gettimeofday(struct timeval *restrict tp, void *restrict tzp);struct timeval *restrict tpstruct timeval는 다음과 같다.struct timeval
{
time_t tv_sec; // seconds
suseconds_t tv_usec; // microseconds
};void *restrict tzpNULL을 넣으면 된다.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?