PTHREAD_MUTEX_INITIALIZER 대 pthread_mutex_init (& mutex, param)


90

차이점이 있습니까?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

또는

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

첫 번째 방법 만 사용하면 충분히 안전합니까?

참고 : 내 질문은 대부분 내가 할 일이 여러 클라이언트를 서버에 연결하고 작업자 스레드로 문의를 해결하는 매우 작은 프로그램에 관한 것입니다.

답변:


74

이전 버전의 POSIX 표준에서 이니셜 라이저를 사용하는 첫 번째 메서드는 변수가 auto함수 본문에 정의 된 변수 일 때가 아니라 정적으로 할당 된 변수에서만 작동하도록 보장됩니다 . auto변수에 대해서도 이것이 허용되지 않는 플랫폼을 본 적이 없지만 POSIX 표준의 최신 버전에서는이 제한이 제거되었습니다.

static변형은 부트 스트랩 코드를 훨씬 쉽게 작성할 수 있기 때문에 가능하다면 정말 바람직합니다. 런타임에 이러한 뮤텍스를 사용하는 코드를 입력 할 때마다 뮤텍스가 초기화되었음을 확신 할 수 있습니다. 이것은 다중 스레딩 컨텍스트에서 귀중한 정보입니다.

init 함수를 사용하는 방법은 예를 들어 재귀 적이거나 스레드간에뿐만 아니라 프로세스간에 공유 할 수있는 것과 같이 뮤텍스에 대한 특수 속성이 필요할 때 선호됩니다.


8

동적 초기화를 사용하여 뮤텍스의 더 많은 속성을 설정할 수 있으며 런타임에 뮤텍스를 추가하는 경우에만 동적 메서드를 사용할 수 있습니다.

하지만 정적 접근 방식이 귀하의 필요에 맞다면 잘못된 것은 없습니다.


" 게다가 런타임에 많은 뮤텍스를 추가하는 경우에만 동적 방법을 사용할 수 있습니다. "그렇다면 이것은 무엇을 의미합니까? 설명하기 쉽지 않은 경우 작은 예?
Kalec

1
@Kalec : 뮤텍스가 할당 된 경우 malloc()(또는 할당 된 개체에 속하는 경우).
Michael Burr

3
@Kalec 뮤텍스 변수 "lock"이 구조체의 일부이면 첫 번째 접근 방식을 따를 수 없습니다. pthread_init ()를 사용해야합니다.
pankaj kushwaha

8

에서 이것을 인용하고 싶습니다 .

POSIX스레드를 사용하면 잠금을 초기화하는 두 가지 방법이 있습니다. 이를 수행하는 한 가지 방법 PTHREAD_MUTEX_INITIALIZER은 다음과 같이 를 사용 하는 것입니다. pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

이렇게하면 잠금이 기본값으로 설정되어 잠금을 사용할 수있게됩니다. 이를 수행하는 동적 방법 (즉, 런타임에)은 pthread_mutex_init()다음과 같이 호출하는 것입니다. int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

이 루틴의 첫 번째 인수는 잠금 자체의 주소이고 두 번째 인수는 선택적 속성 집합입니다. 속성에 대해 자세히 읽어보십시오. NULL을 전달하는 것은 단순히 기본값을 사용합니다. 어느 쪽이든 작동 하지만 일반적으로 동적 (후자) 방법을 사용합니다.


5

기본 뮤텍스 속성이 적절한 경우 PTHREAD_MUTEX_INITIALIZER 매크로를 사용하여 뮤텍스를 초기화 할 수 있습니다.

뮤텍스에 대한 속성을 지정하려면 동적 초기화 ........로 이동하십시오.

이 효과는 오류 검사가 수행되지 않는다는 점을 제외하면 매개 변수 attr이 NULL로 지정된 pthread_mutex_init () 호출에 의한 동적 초기화와 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.