쓰레드 동기화  시스템프로그래밍 

2013.04.03. 21:55  수정  삭제

복사http://blog.naver.com/pwk0810/40186231086

전용뷰어 보기

 

출처 : 열혈 강의 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);

---------------------------------------------------------------------------------------


Posted by 뉴암스테르담
l