스레드 관리

EEEFFEE·2023년 11월 15일

System Programming

목록 보기
10/19

23.11.14 최초 작성

1. 스레드 관리

  • pthread_create 스레드 생성

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start)(void *), void *arg);

///
*thread : 스레드의 ID를 저장하는 공간
*attr : 스레드의 속성
start : 실행할 함수의 주소
arg : 실행할 함수의 인자

Return
(0 : Success, else : Fail)

  • pthread_join : 지정한 스레드가 종료할 때까지 대기

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);
///
thread : 스레드의 ID
retval : 스레드의 결과값을 저장할 공간

Return
(0 : Success, else : Fail)

  • pthread_detach : join을 호출하지 않아도 프로그램이 종료할 때 자동적으로 스레드가 끝나도록 설정하는 함수
    해당 함수를 사용한 스레드는 join을 할 수 없음

#include <pthread.h>

int pthread_detach(pthread_t thread);

///
thread : 스레드의 ID

Return
(0 : Success, else : Fail)

ex) 예제

  • simple_thread : 문자열을 출력하는 스레드를 생성하는 코드

#include <pthread.h>
#include "tlpi_hdr.h"

static void *
threadFunc(void *arg)
{
    char *s = arg;

    printf("%s", s);

    return (void *) strlen(s);
}

int
main(int argc, char *argv[])
{
    pthread_t t1;
    void *res;
    int s;

    s = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
    if (s != 0)
        errExitEN(s, "pthread_create");

    printf("Message from main()\n");
    s = pthread_join(t1, &res);
    if (s != 0)
        errExitEN(s, "pthread_join");

    printf("Thread returned %ld\n", (long) res);

    exit(EXIT_SUCCESS);
}

  • detached_attrib : pthread_detach를 통해 프로그램 종료 시 스레드도 종료되도록 설정한 코드

#include <pthread.h>
#include "tlpi_hdr.h"

static void *
threadFunc(void *x)
{
    return x;
}

int
main(int argc, char *argv[])
{
    pthread_t thr;
    pthread_attr_t attr;
    int s;

    s = pthread_attr_init(&attr);       /* Assigns default values */
    if (s != 0)
        errExitEN(s, "pthread_attr_init");

    s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (s != 0)
        errExitEN(s, "pthread_attr_setdetachstate");

    s = pthread_create(&thr, &attr, threadFunc, (void *) 1);
    if (s != 0)
        errExitEN(s, "pthread_create");

    s = pthread_attr_destroy(&attr);    /* No longer needed */
    if (s != 0)
        errExitEN(s, "pthread_attr_destroy");

    s = pthread_join(thr, NULL);
    if (s != 0)
        errExitEN(s, "pthread_join failed as expected");

    exit(EXIT_SUCCESS);
}

2. Mutex

2.1 Mutex 초기화

  • phread_mutex_init : 뮤텍스 초기화
  • pthread_mutex_destroy : 뮤텍스 삭제

#include <pthread.h>

pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;		//전역변수로 바꾸는 방법

int phread_mutex_init(pthread_mutex_t *mutex, const int pthread_mutexattr_t *attr);	
													//mutex 초기화

int pthread_mutex_destroy(pthread_mutex_t *mutex);	//


///
mutex : 초기화 또는 삭제할 뮤텍스를 지정
*attr : 뮤텍스 속성 오브젝트를 지정

Return
(0 : Success, else : Error)

  • pthread_cancel : 스레드 취소

#include <pthread.h>

int pthread_cancel(pthread_t thread);
///

Return
(0 : Success, else : Error) 

3.2 Lock

  • pthread_mutex_lock : 스레드가 lock 획득
  • pthread_mutex_unlock : 스레드가 lock 반환

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *mutex);

///

Return 

3.3 조건변수를 통한 상태 변화 알리기

  • pthread_cond_signal, pthread_cond_broadcast : 스레드에게 시그널을 보내서 pthread_cond_wait으로 대기중인 스레드 깨움

  • pthread_cond_wait 시그널이 올 때 까지 기다림


#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);			//하나의 스레드 대상
int pthread_cond_broadcast(pthread_cond_t *cond);		//모든 스레드 대상
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *timeout);

///
cond : 신호에 대한 조건 지정
mutex : 잠긴 뮤텍스 지정
timeout : 차단된 상태 제한시간을 지정

Return
(0 : Success, else : Error)

3. 예제

3.1 스레드 관리


#include <pthread.h>

///

Return

3.2 Mutex & Lock


#include <pthread.h>

///

Return

접기/펼치기 >"내가 없어져볼게 얍"

0개의 댓글