thread mutex에 대한 메모
이른바 thread
'스레드'는 여러 처리를 병행하여 진행하는 방법 중의 하나다.
한 과정에서 여러 개의 처리를 병행하여 실행하는 메커니즘에서 메모리 공간은 공유되기 때문에 변수를 공유할 수 있다.
변수를 공유할 때 문제가 발생하는 것은 여러 개의 공유 데이터를 동시에 접근할 때 일치하지 않는 것이다.
그 문제를 해결하기 위해 사용하는 것은'배외 제어'라고 불리는 처리로 공유된 데이터에 동시에 접근하는 것을 방지하는 메커니즘이다.
mutex 소개
'정음' 은 '배타 처리' 라고 불리는 방법으로 공유 데이터에 대한 접근을 제어한다.
pthread_create
현재 프로세스에 새로운 제어 라인을 추가합니다.
//プロトタイプ
int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void*(*start_routine)(void *), void *arg);
필요한 상태 동작을 가진tattr에서 pthread호출 함수.NULL을 스레드로 사용하여 생성된 속성 매개 변수는 기본 속성을 사용하는 것과 동일한 효과를 가집니다.
어떤 상황에서도 기본 라인이 생성됩니다.
tattr를 초기화할 때 기본 동작을 가져옵니다.
start_routine은 새로운 단서에서 실행되는 함수입니다.
start_루틴이 회복되었을 때, 루틴은 start에서 종료됩니다.루틴을 통해 되돌아오는 값으로 설정하고 끝냅니다.
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_detach
//プロトタイプ
int pthread_detach(thread_t tid);
pthread_detach () 함수는tid가 끝날 때tid가 소모한 메모리 자원을 즉시 방출할 수 있도록 합니다.그러나, 이것은 다른 라인 pthread-를join을 사용하면tid의 끝과 동기화할 수 없습니다.
tid가 끝나지 않았을 때 pthreaddetach ()에 따라 이 라인은 끝나지 않습니다.
같은 라인에 여러 pthread가 있습니다호출할 때의 효과가 일정하지 않다.
pthread_join () 함수에 비해 "tid가 끝날 때까지 기다리지 않고"tid가 끝날 때 tid가 소모하는 메모리 자원을 방출할 것을 보장합니다. "
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_join
//プロトタイプ
int pthread_join(thread_t tid, void **status);
pthread_함수는 지정된 루틴이 끝날 때까지 루틴 블록을 호출합니다.지정한 라인은 현재 프로세스의 라인이고 끊기지 않은 라인이어야 합니다.
status가 NULL이 아닌 경우 pthreadjoin () 이 정상적으로 끝났을 때 status가 가리키는 저장 위치에서 끝난 라인의 끝 상태를 저장합니다.
여러 개의 스레드가 같은 스레드의 끝을 기다릴 수 없습니다.
이 상태가 발생하면 일부 스레드는 정상으로 돌아가고 다른 스레드는 ESRCH 오류로 돌아가 실패합니다.
pthread_join () 복구 후, 이 라인과 연결된 창고 영역을 이 응용 프로그램에서 다시 사용할 수 있습니다.
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_mutex_init
//プロトタイプ
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
pthread_mutexattr_init() 함수는 객체와 연관된 속성을 기본값으로 초기화합니다.모든 속성 대상의 저장 영역은 실행할 때 라인에 의해 지정됩니다.
이 함수를 호출할 때 pshared 속성의 기본값은 PTHREAD입니다.PROCESS_PRIVATE에서는 초기화된 mutex를 한 과정에서만 사용할 수 있습니다.
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_mutex_destroy
//プロトタイプ
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)
pthread_mutexattr_Destroy () 함수는 pthread -mutexattr_init () 로 생성된 속성 대상을 관리하는 데 사용되는 저장 영역의 분배를 취소합니다.반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_mutex_lock
//プロトタイプ
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_lock() 함수는 mutex가 가리키는 mutex를 잠급니다.pthread_mutex_lock () 을 되돌릴 때, 호출 루트가 잠겼습니다.
만약 mutex가 다른 라인에 잠겨 있다면, mutex가 사용할 수 있을 때까지 라인 블록을 호출합니다.
mutex 유형은 PTHREADMUTEX_NORMAL의 경우 잠금 해제 테스트가 수행되지 않습니다.
mutex를 다시 잠그면 사라진 자물쇠가 발생합니다.
만약 루틴이 잠기지 않은 mutex나 잠기지 않은 mutex를 잠그려고 시도한다면, 발생하는 동작은 정의되지 않습니다.
mutex 유형은 PTHREADMUTEX_ERRORCHECK의 경우 버그 체크를 제공합니다.
잠긴 mutex를 다시 잠그려면 오류가 반환됩니다.
잠기지 않은 mutex나 잠금해제된 mutex를 해제하려고 시도할 때 오류가 되돌아옵니다.
mutex 유형은 PTHREADMUTEX_RECURSIVE의 경우 mutex는 잠긴 횟수를 기록합니다.
루틴이 처음에 mutex를 정상적으로 얻었을 때, 잠금 계수는 1로 설정됩니다.
라인이 이mutex를 더 잠글 때마다 잠금 계수가 하나씩 증가합니다.
루틴이 mutex를 잠글 때마다 잠금 계수가 하나씩 줄어든다.
잠금 계수가 0일 때 다른 라인의mutex를 얻을 수 있습니다.
잠기지 않은 mutex나 잠금해제된 mutex를 해제하려고 시도할 때 오류가 되돌아옵니다.
mutex 유형은 PTHREADMUTEX_DEFAULT의 경우 반복적으로 mutex를 잠그려고 하면 발생하는 동작이 정의되지 않습니다.
잠금mutex의 라인이 잠금을 해제하려고 시도하지 않으면, 발생하는 동작이 정의되지 않습니다.
또한 잠기지 않은 mutex의 잠금을 해제하려는 경우 발생하는 동작이 정의되지 않습니다.
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
pthread_mutex_unlock
//プロトタイプ
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_unlock () 은mutex가 가리키는 mutex의 잠금을 해제합니다.mutex를 방출하는 방법은 mutex의 유형 속성에 달려 있습니다.
pthread_mutex_unlock () 을 호출할 때, 지정한 mutex가 가리키는 mutex 대상 블록의 루틴이 존재하고, 이 호출을 통해 mutex를 사용할 수 있다면, 스케줄링 정책에 따라 mutex의 루틴을 얻을 수 있습니다.
PTHREAD_MUTEX_RECURSIVE 유형의 mutex의 경우 mutex가 사용할 수 있는 계수는 0,puthread이다mutex_unlock () 의 라인을 호출해서 이 mutex의 잠금을 해제할 때
반환값
정상적으로 끝날 때는 0이다.
이외의 반환 값은 오류가 발생했음을 나타낸다.
Reference
이 문제에 관하여(thread mutex에 대한 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hosu/articles/5ee73a24e8dd2d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)