반응형
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.
반응형
'C언어 > C언어 심화 & 특수' 카테고리의 다른 글
[C99] VLA(Variable Length Array; 가변 길이 배열)에 관한 깊은 고찰 (1) | 2023.10.31 |
---|---|
[C99] Compound Literals, C에서의 이름없는 임시 객체 (0) | 2020.03.21 |
[C99] 포인터 최적화를 위한 restrict 키워드 (0) | 2020.03.21 |
[C11] 컴파일 타임 오류내기, static_assert (0) | 2020.03.21 |
[C99] C언어에서 표준 bool 타입 사용하기 (0) | 2020.03.21 |