C Thread 사용법

By | 2022년 2월 5일
Table of Contents

C Thread 사용법

Linux pthread 를 이용해 스래드를 사용할 수 있다.

Thread 생성

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void *t1_func(void *data) {
    pid_t pid;
    pthread_t tid;

    pid = getpid();
    tid = pthread_self();

    char *thread_name = (char *) data;

    for (int i = 0; i < 10; i++) {
        printf("[%s] pid: %u, tid: %x --- %d\n", thread_name, (unsigned int) pid, (unsigned int) tid, i);
        sleep(1);
    }
}

int main() {
    pthread_t p_thread;
    int t_id;
    int t_status;

    char *p1 = "thread_1";
    char *p_main = "thread_main";

    t_id = pthread_create(&p_thread, NULL, t1_func, (void *) p1);
    if (t_id < 0) {
        perror("thread create error");
        exit(1);
    }

    // main thread 와 생성한 thread 가 동시에 실행된다.
    t1_func((void *) p_main);

    // 생성한 스래드의 종료를 기다린다.
    pthread_join(p_thread, (void **) &t_status);

    printf("finished.\n");
}
gcc main.c -lpthread

./a.out
[thread_main] pid: 1270690, tid: e21c7740 --- 0
[thread_1] pid: 1270690, tid: e21c6700 --- 0
[thread_main] pid: 1270690, tid: e21c7740 --- 1
[thread_1] pid: 1270690, tid: e21c6700 --- 1
[thread_main] pid: 1270690, tid: e21c7740 --- 2
[thread_1] pid: 1270690, tid: e21c6700 --- 2
[thread_main] pid: 1270690, tid: e21c7740 --- 3
[thread_1] pid: 1270690, tid: e21c6700 --- 3
[thread_main] pid: 1270690, tid: e21c7740 --- 4
[thread_1] pid: 1270690, tid: e21c6700 --- 4
[thread_main] pid: 1270690, tid: e21c7740 --- 5
[thread_1] pid: 1270690, tid: e21c6700 --- 5
[thread_main] pid: 1270690, tid: e21c7740 --- 6
[thread_1] pid: 1270690, tid: e21c6700 --- 6
[thread_main] pid: 1270690, tid: e21c7740 --- 7
[thread_1] pid: 1270690, tid: e21c6700 --- 7
[thread_main] pid: 1270690, tid: e21c7740 --- 8
[thread_1] pid: 1270690, tid: e21c6700 --- 8
[thread_main] pid: 1270690, tid: e21c7740 --- 9
[thread_1] pid: 1270690, tid: e21c6700 --- 9
finished.

Thread 간 변수 공유

thread 는 하나의 프로세스 상에서 메모리를 공유하며 실행된다.
따라서, 공유 변수에 대한 변수변경은 매우 쉽다.
하지만, 하나의 thread 에 전달된 변수가 어디서 변경되었는지 추적이 매우 어렵다.

Thread 간 변수 잠금

pthread_mutex_t

thread 실행의 순서 보장이 필요없는 경우 사용한다.
한번에 하나의 thread 만 실행된다.

pthread_mutex_t mutex_lock;

// 다른 모든 thread 를 멈추고 하나의 thread 만 실행된다.
pthread_mutex_lock(&mutex_lock);

pthread_mutex_unlock(&mutex_lock);

semaphore

답글 남기기