Thread POSIX API
하나의 프로세스 안에서 여러 스레드를 이용할 수 있도록 운영체제가 지원하는 API
pthread_create(&t1, NULL, func, NULL)
<pthread.h>
/usr/include/pthread.h
gcc ./sample.c -o ./gg -lpthread
pthread_t
: 구조체상세 API는 Thread API 참고
#include<stdio.h>
#include<pthread.h>
#include <stdlib.h>
int a = 100; //.data
int b; //.bss
void* abc(){
int c = 10; //stack
printf("=================\n");
printf(".data : 0x%p\n", (void*)&a);
printf(".bss : 0x%p\n", (void*)&b);
printf(".stack : 0x%p\n", (void*)&c);
printf(".heap : 0x%p\n", (int*)malloc(4));
return 0;
}
int main(){
pthread_t t1, t2;
pthread_create(&t1, NULL, abc, NULL);
pthread_create(&t2, NULL, abc, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
공유 변수를 각각의 함수가 다르게 조작하여, 원하는 동작이 이루어지지 않을 수 있다
Race Condition
Critical Section
Thread synchronization
키를 기반으로 하는 상호 배제 기법
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mlock;
int cnt=0;
void *run(){
pthread_mutex_lock(&mlock); // 잠그고
for(int i=0; i<10000; i++) cnt++; // cnt = critical section
pthread_mutex_unlock(&mlock); // 푼다
}
int main(){
pthread_mutex_init(&mlock, NULL);
pthread_t tid[4];
for(int i=0; i<4; i++) pthread_create(&tid[i], NULL, run, NULL);
for(int i=0; i<4; i++) pthread_join(tid[i], NULL);
printf("%d\n", cnt);
pthread_mutex_destroy(&mlock);
return 0;
}
상세 API는 Mutex API 참고