정적 뮤텍스

System Program/mutex 2014. 3. 10. 19:44

1. 정적 뮤텍스

 

뮤텍스는 쓰레드 공유 자원 사용을 동기화하는 목적으로 사용된다.

뮤텍스는 정적 변수에 초기값을 줘서 고정되는 정적 뮤텍스와 실행 시에 동적으로 생성할 수 있는 동적 뮤텍스로

구분된다. 여기서는 정적 뮤텍스 사용법에 대해서 알아본다.  

 

2. 정적 뮤텍스 초기화

 

정적 뮤텍스는 pthread_mutex_t 형의 변수에 초기값을 반드시 할당해야 하며,

기본적으로 정적 초기화는 PTHREAD_MUTEX_INITIALIZER 값만 설정하는 것이 가능하다.

하지만 리눅스는 아래 [가능한 초기값] 부분에 기술된 초기값도 정적 초기값으로 사용할 수 있다.

 

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;

 

[가능한 초기값]

 가능한 초기값

 설명

 PTHREAD_MUTEX_INITIALIZER

 Fast Mutex, Mutex 생성 시 초기 Default 값

 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP

 쓰레드로부터 다시 Lock을 획득하도록 허용

 PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP

 mutx 에러 체크용

 

위의 리눅스 초기값은 동적 뮤텍스 부분에서 초기화에 사용되는 값과 일대일 매칭된다.

 

3. 뮤텍스 잠금과 풀림 함수

 

초기 뮤텍스는 풀려 있다. 뮤텍스를 잠궈서 다른 쓰레드의 임계영역 진입을 차단하거나

해제하고자 할 경우에는 아래 함수들을 사용한다.

 

#include <pthread.h>

 

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

 

성공하면 '0'을 리턴하고, 에러가 발생하면 에러번호(양수)를 리턴한다.  

 

반드시 위의 함수는 쌍으로 사용되야 한다. 만약 잠근 뮤텍스를 다시 잠그려고 하면 데드락되거나

EDEADLK 에러값을 설정한다. 리눅스는 기본적으로 데드락된다.

 

4. 추가적인 뮤텍스 잠금과 풀림 함수

 

#include <pthread.h>

 

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *restrict abs_timeout);

 

성공하면 '0'을 리턴하고, 에러가 발생하면 에러번호(양수)를 리턴한다.  

 

pthread_mutex_trylock() 함수는 뮤텍스가 현재 잠겨 있으면 EBUSY 에러값을 설정하고 실패한다.

pthread_mutex_timedlock() 함수는 뮤텍 잠근에 시간제한을 둔 함수이며 지정된 시간안에 잠금에 실패하면

ETIMEDOUT 에러값을 설정하고 리턴한다. 기본 동작은 pthread_mutex_lock()와 같다.

 

5. 뮤텍스 에러 가능값

 

pthread_mutex_lock()함수는 아래의 에러코드를 반환한다.

 

  • EINVAL

뮤텍스가 잘못 초기화 되었다.

  • EDEADLK

이미 잠금을 얻은 쓰레드가 다시 잠금을 요청할 때 (error checking 뮤텍스일 경우 사용할 수 있다)

 

pthread_mutex_trylock()함수는 아래의 에러코드를 반환한다.

 

  • EBUSY

뮤텍스가 잠겨 있어서 잠금을 얻을 수 없다.

  • EINVAL

뮤텍스가 잘못 초기화 되었다.

 

'System Program > mutex' 카테고리의 다른 글

조건변수  (0) 2014.03.10
동적 뮤텍스  (0) 2013.07.04
: