C언어/C언어 심화 & 특수

[C11] C언어 표준 스레드 실행

카루-R 2020. 3. 21. 10:42
반응형

C11에 들어서면서 C언어도 정식으로 스레드를 지원하기 시작했습니다.

#include <threads.h>

만 해 주시면 모든 준비가 끝납니다.

#include <stdio.h>
#include <threads.h>
#include <time.h>

int func() {
    thrd_sleep(&(struct timespec){.tv_sec=3}, NULL);
    puts("func()");
}

int main() {
    thrd_t thread; // 스레드 타입 변수
    int result; // 결과값
    
    thrd_create(&thread, func, NULL);
    thrd_join(thread, &result);
    
    printf("result: %d", result);
}

간단합니다. C++에서처럼 thrd_t 변수를 선언하고, thrd_create를 통해 스레드를 생성합니다.

int thrd_create(thrd_t *_Thr, thrd_start_t _Func, void *_Arg);

_Thr 자리엔 스레드 변수의 주소를, _Func에는 함수를, _Arg에는 _Func의 매개변수를 전달하면 됩니다. 없으면 NULL을 패스하면 되고요. 그래고 thrd_join을 통해 대기합니다.

int thrd_join(thrd_t _Thr, int *_Res);

_Thr에는 스레드 변수를, _Res에는 결과값을 전달할 변수의 주소를 넣으면 됩니다. 이때 성공하면 thrd_success를, 실패하면 thrd_error을 반환합니다. 이 둘은 enum값으로, 딱히 숫자는 모르고 문자 그대로 사용하면 됩니다.

일정기간 스레드를 정지시키려면 thrd_sleep()을 이용합니다.

int thrd_sleep(const struct timespec * _Duration,
                struct timespec* _Remaining );

_Duration에는 정지할 기간을 나타냅니다. timespec은 에 정의되어있는 구조체입니다.

나노초와 일반초를 지원하는데, 지정 초기화를 이용해서 정할 수 있습니다. 그리고 이름없는 임시객체를 통해 포인터로 넘기면 됩니다.

thrd_sleep(&(struct timespec){ .tv_sec=3 }, NULL);

3초간 멈춘다는 코드입니다. 이 문법이 이해가 잘 안 된다면 이 글을 참고하세요.

참고로 struct timespec에서 나노초는 0~999,999,999까지의 범위를 지원합니다. 타입은 long.

 

반응형