'System Program/mutex'에 해당되는 글 3건

  1. 2014.03.10 조건변수
  2. 2014.03.10 정적 뮤텍스
  3. 2013.07.04 동적 뮤텍스

조건변수

System Program/mutex 2014. 3. 10. 21:41

1. 조건 변수

 

조건 변수는 항상 뮤텍스와 함께 사용된다. 뮤텍스에 대한 보조적인 역활을 한다고 생각한다.

뮤텍스는 공유 변수에 대한 상호 배제를 제공하는 한편, 조건 변수는 어떤 상태 변화를

쓰레간에 보내면서 더 정교한 상호 배제를 제공할 수 있다.

 

2. 정적 조건 변수 초기화

 

데이터형은 pthread_cond_t 이다. 뮤텍스 정적 초기화 구문과 같다.

 

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

 

3. 조건 변수 대기와 시그널

 

조건 변수는 하나 이상 쓰레드가 조건 변수 상태 변화를 기다리고 있을 때, 조건 변수의 상태를 알리는

시그널을 보낸다. 여기서 시그널은 일반적인 프로세스와 쓰레드에서 사용되는 시그널이 아니다.

따라서 조건 변수의 상태를 알리는 행위를 시그널을 보낸다라고 하고,

조건 변수의 상태를 기다리는 쪽에서 행위를 대기라 명한다.

 

#include <pthread.h>

 

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

 

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

 

 

pthread_cond_signal() 함수와 pthread_cond_broadcast() 모두 cond로 지정된 조건 변수에

시그널을 보낼 수 있다. pthread_cond_wait() 함수는 조건 변수 상태 변화를 기다리면서 대기한다.

시그널 전송 두 함수의 차이는 pthread_cond_wait()가 여러 쓰레드에서 블록되어 대기 중 일 때 차이가 난다.

pthread_cond_signal() 함수는 최소 하나의 쓰레드가 깨어 난다는 것만 보장하는

반면 다른 함수는 모든 쓰레드가 깨어나기를 보증한다.

 

4. 동적 조건 변수 할당 및 제거 함수

 

#include <pthread.h>

 

int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

int pthread_cond_destroy(pthread_cond_t *cond); 

 

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

 

 

위 함수의 사용법과 동작 기법은 동적 뮤텍스 사용법과 같다. 따라서 구체적인 사용법은 메뉴얼 또는

동적 뮤텍스 속성 부분을 참조바람.

 

 

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

정적 뮤텍스  (0) 2014.03.10
동적 뮤텍스  (0) 2013.07.04
:

정적 뮤텍스

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
:

동적 뮤텍스

System Program/mutex 2013. 7. 4. 09:49

1. 동적 뮤텍스

 

실행 중에 뮤텍스를 할당하여 사용하고자 하는 응용에 적합한 방식이다.

또한 PTHREAD_MUTEX_INITIALIZER 초기값 이외값은 정적 초기값으로 사용될 수 없고

동적 뮤텍스를 통해서만 가능한다.

 

2. 동적 뮤텍스 초기화

 

#include <pthread.h>

 

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

 

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

 

3. 동적 뮤텍스 제거

 

동적으로 할당된 뮤텍스가 더 이상 필요하지 않으면 제거해야 한다. 아래 함수를 통해서 제거할 수 있다.

 

#include <pthread.h>

 

int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

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

 

4. 뮤텍스 속성

 

위의 뮤텍스 초기화부분에 필요한 attr 설정 부분에 대한 자세한 설명은 생략하고 예제 코드로 대체한다.

NULL로 설정되면 기본 속성값으로 뮤텍스가 초기화된다.

 

pthread_mutex_t mtx;
pthread_mutexattr_t mtxAttr;
int retval, type;

retval = pthread_mutexattr_init(&mtxAttr);
if(retval != 0)
{
	perror("pthread_mutexattr_init : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutexattr_settype(&mtxAttr, PTHREAD_MUTEX_ERRORCHECK);
if(retval != 0)
{
	perror("pthread_mutexattr_settype : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutex_init(&mtx, &mtxAttr);
if(retval != 0)
{
	perror("pthread_mutex_init : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutexattr_destroy(&mtxAttr);
if(retval != 0)
{
	perror("pthread_mutexattr_destroy : ");
	exit(EXIT_FAILURE);
}


 

뮤텍스 속성도 초기화 함수와 기타 설정함수, 마지막으로 제거함수로 구성되어 있다.

여기서는 단지 뮤텍스 종류에 대해서만 살펴보고 자세한 내용은 메뉴얼 참조.

 

 종류

설명 

 PTHREAD_MUTEX_NORMAL

셀프 데드락 감지 기능이 없어서 이미 잠겨 있는 뮤텍스를 잠그려고 하면 뮤텍스는 데드락된다.  

 PTHREAD_MUTEX_ERRORCHECK

모든 동작에서 에러 검사를 수행한다. 디버그용으로 적합하다.  

 PTHREAD_MUTEX_RECURSIVE

잠금 카운터 개념이 추가되어 뮤텍스 잠금이 계속될 때 카운터가 증가한다.  

 

 

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

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