정의: 쓰레드는 프로세스 내에서 실행되는 하나의 독립적인 실행 흐름이다. 한 프로세스 내에 여러 쓰레드가 생성되어 병렬적으로 실행되는 것처럼 보일 수 있다.
특징:
| 구분 | 프로세스 | 쓰레드 |
|---|---|---|
| 정의 | 실행 중인 프로그램의 독립된 인스턴스 | 프로세스 내의 독립적인 실행 흐름 |
| 메모리 | 고유의 메모리 공간 사용 | 프로세스 내의 자원 및 메모리 공간 공유 |
| 독립성 | 각 프로세스는 독립적이며 다른 프로세스에 영향을 미치지 않음 | 쓰레드는 프로세스 내의 다른 쓰레드와 영향을 주고받음 |
| 속도 | 생성/종료 시 오버헤드가 크고 느림 | 생성/종료가 상대적으로 가볍고 빠름 |
| 예시 | 계산기, 그림판과 같은 독립 애플리케이션 | 파일 읽기, 네트워크 요청 등 세부 작업 분할 |
문제 상황:
해결 방법:
쓰레드가 Lock을 걸고 나서 Unlock을 호출하지 않거나 다른 자원의 Lock을 기다리다 서로 대기 상태에 빠질 경우 Deadlock이 걸린다.
해결책:
타임아웃 설정: 일정 시간이 지나면 Lock을 강제로 해제.
교착 상태 회피 알고리즘: 자원 요청 순서를 정하거나 우선순위를 설정.
메모리 누수 (Memory Leak):
쓰레드가 사용한 메모리를 제대로 반환하지 않으면 메모리 누수가 발생. 이는 시스템 성능 저하 및 실행 중단의 원인이 됨.
예방:
자원을 사용 후 반드시 해제 (free() 등).
자동화된 메모리 관리 도구(스마트 포인터 등)를 사용하는 것도 고려.
#include <stdio.h>
#include <pthread.h>
int a=0;
void * thread1(void * arg){ //함수형은 상관없음
printf("arg : %d\n", (int)arg);
while(1){
printf("thread1 a[%d]\n",++a);
sleep(2);
}
return NULL;
}
int main(){
pthread_t s_thread;
int b = 88;
pthread_create(&s_thread,NULL,thread1,(void *)b);
pthread_join(s_thread,NULL);
}
실행결과
$ gcc thread.c -lpthread
pthread 라이브러리 참조해줘야 함.

join을 해야 쓰레드가 돌아가는 것을 main이 기다려준다.
#include <stdio.h>
#include <pthread.h>
int a=0;
void * thread1(void * arg){ //함수형은 상관없음
printf("arg : %d\n", (int)arg);
while(1){
printf("thread%d a[%d]\n",(int)arg,++a);
sleep(2);
}
return NULL;
}
int main(){
pthread_t s_thread[2];
int id1 = 77;
int id2 = 88;
pthread_create(&s_thread[0],NULL,thread1,(void *)id1);
pthread_create(&s_thread[1],NULL,thread1,(void *)id2);
while(1){
printf("main loop");
sleep(1);
}
//pthread_join(s_thread[0],NULL);
//pthread_join(s_thread[1],NULL);
}
이런식으로 하면 쓰레드가 3개가 돌아가는 것이다.

#include <stdio.h>
#include <pthread.h>
int a=0;
pthread_mutex_t mutex;
void * thread1(void * arg){
printf("arg : %d\n", (int)arg);
while(1){
pthread_mutex_lock(&mutex); //lock
printf("thread%d a[%d]\n",(int)arg,++a);
pthread_mutex_unlock(&mutex); //unlock
sleep(2);
}
return NULL;
}
int main(){
pthread_t s_thread[2];
int id1 = 77;
int id2 = 88;
pthread_mutex_init(&mutex,NULL); //NULL = fast
pthread_create(&s_thread[0],NULL,thread1,(void *)id1);
pthread_create(&s_thread[1],NULL,thread1,(void *)id2);
while(1){
printf("main loop\n");
sleep(1);
}
//pthread_join(s_thread[0],NULL);
//pthread_join(s_thread[1],NULL);
}

a가 동시에 출력되는 것을 막아줌. 크리티컬 영역을 해결함.