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);