Thead Safe
스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.
Deadlock의 예시
Thread-safe를 지키기 위한 방법
1. Re-entrancy
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.
2. Thread-local storage
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.
3. Mutual exclusion
공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.
4. Atomic operations
공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.
1) MUTEX를 이용한 동기화 방법
pthread_mutex_lock(&mutx);
... Critical Section
pthread_mutex_unlock(&mutx);
2) SEMAPHORES를 이용한 동기화 방법
A Thread
state = sem_init(&bin_sem,0,0);
while(number != 0)
wait...
데이터 처리
sem_post(&bin_sem);
B Thread
sem_wait(&bin_sem);
데이터 처리
통상적으로 Mutual Exclusion(상호배제) 방식을 이용한 Critical Section 처리가 자주 사용되는 편이다.
상호배제란, 한 Thread가 자원에 접근할 때 다른 Thread의 접근을 막는 것을 의미한다.
'Development > OS' 카테고리의 다른 글
[linux] 오래된 log 파일 찾아서 지우기 (0) | 2017.11.09 |
---|---|
[Linux] 리눅스 ssh 프롬프트 폰트 coloring 적용 (2) | 2017.07.23 |
[Linux] sudo 로그인 시 패스워드 입력 없이 권한얻기 (0) | 2017.07.23 |
[Linux] 자바 웹 어플리케이션 서버 실행 쉘(Shell) 스크립트 (1) | 2017.05.31 |
[C] 컴파일러 메모리 배치표 (0) | 2015.11.21 |