쓰레드 동기화 ![]() ![]()
|
출처 : 열혈 강의 TCP/IP Programming
+ 동기화의 두가지 측면
- 동일한 메모리 영역으로의 동시 접근이 발생하는 상황
- 동일한 메모리 영역에 접근하는 쓰레드의 실행 순서를 지정해야 하는 상황
- 쓰레드 A믄 메모리 공간에 값을 가져다 놓고, 쓰레드 B는 이 값을 가져가는 역할을 담당한다.
- 이러한 예에서 처럼 실행 순서를 컨트롤 해야 하는 상황에서의 동기화 기법을 말하며
- 뮤텍스(MUTEX 와 세마포어(Semaphore ) 가 이에 해당한다.
+ 뮤텍스(Mutex) - Mutual Exclusion
- 접근 보호를 위해서 들어갈때 문을 잠그고 나올 때 문을 연다.
- 사용중이라면, 밖에서 대기해야 한다.
- 대기중인 사람이 둘 이상이 될 수 있고, 이들은 대기 순서에 따라서 입성한다.
- 화장실에 비유
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_init(pthead_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_destory(pthread_mutex_t *mutex);
pthread_mutex_t mutex;
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
unlock 을 호출하지 못하면 블록킹 상태에 빠지게 된다. 이것을 deadlock 상태라고 한다.
-> 성공시 0, 실패시 0이외의 값 반환
mutex의 lock, unlock 의 호출수를 최대한 자제
+ 세마 포어
바이너리 세마 포어는 0과 1만을 사용하여 쓰레드의 실행 순서 컨트롤 중심의 동기화를 설명
#include
int sem_init(sem_t *sem, int pshared, unsigned int value);
- pshared 0 이외의 값 전달시 , 둘 이상의 프로세스에 의해 접근 가능한 세마 포어 생성, 0 전달 시 하나의 프로세스 내에서만 접근 가능한 세마 포어 생성, 우리는 하나의 프로세스 내에 존재하는 쓰레드의 동기화가 목적이므로 0을 전달
int sem_destory(sem_t * sem);
성공시 0, 실패시 0 이외의 반환값
int sem_post( sem_t *sem); // 세마 포어 값을 0으로
itn sem_wait(sem_t *sem); // 세바 포어 값을 1로
- 세마 포어 갑시 0인 상태에서 sem_wait 함수가 호출하면, 호출한 쓰레드는 함수가 반환되지 않아서 블록킹 상태에 놓이게 된다.
- 다른 쓰레드가 sem_post 를 호출하면 세마 포어 값이 1이 되므로, 이 1을 0으로 감소시키면서 블록킹 상태에서 빠져나가게 된다.
sem_init(&sem_one, 0 , 0);
sem_init(&sem_two, 0, 0);
pthread_create(&id_t1, null , read, null);
pthread_create(&id_t2, null, acuu, null);
pthread_join(id_t1, null);
pthread_join(id_t2, null);
sem_destory(&sem_one);
sem_destory(&sem_two);
...
sem_wait(&sem_two);
scanf(...);
sem_pos(&sem_one);
sem_wait(&sem_one);
sum+=num;
sem_post(&sem_two);
---------------------------------------------------------------------------------------
'SYSTEM PROGRAMMING' 카테고리의 다른 글
windows 에서의 thread (0) | 2015.08.05 |
---|---|
쓰레드의 소멸과 멀티 쓰레드 기반의 다중 접속 서버의 구현 (0) | 2015.08.05 |
쓰레드의 문제점과 임계 영역( Critical Section ) (0) | 2015.08.05 |
쓰레드의 생성 및 실행 (0) | 2015.08.05 |
쓰레드의 이론적 이해 (0) | 2015.08.05 |