차이점이 있습니까?
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
또는
pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);
첫 번째 방법 만 사용하면 충분히 안전합니까?
참고 : 내 질문은 대부분 내가 할 일이 여러 클라이언트를 서버에 연결하고 작업자 스레드로 문의를 해결하는 매우 작은 프로그램에 관한 것입니다.
답변:
이전 버전의 POSIX 표준에서 이니셜 라이저를 사용하는 첫 번째 메서드는 변수가 auto
함수 본문에 정의 된 변수 일 때가 아니라 정적으로 할당 된 변수에서만 작동하도록 보장됩니다 . auto
변수에 대해서도 이것이 허용되지 않는 플랫폼을 본 적이 없지만 POSIX 표준의 최신 버전에서는이 제한이 제거되었습니다.
이 static
변형은 부트 스트랩 코드를 훨씬 쉽게 작성할 수 있기 때문에 가능하다면 정말 바람직합니다. 런타임에 이러한 뮤텍스를 사용하는 코드를 입력 할 때마다 뮤텍스가 초기화되었음을 확신 할 수 있습니다. 이것은 다중 스레딩 컨텍스트에서 귀중한 정보입니다.
init 함수를 사용하는 방법은 예를 들어 재귀 적이거나 스레드간에뿐만 아니라 프로세스간에 공유 할 수있는 것과 같이 뮤텍스에 대한 특수 속성이 필요할 때 선호됩니다.
동적 초기화를 사용하여 뮤텍스의 더 많은 속성을 설정할 수 있으며 런타임에 뮤텍스를 추가하는 경우에만 동적 메서드를 사용할 수 있습니다.
하지만 정적 접근 방식이 귀하의 필요에 맞다면 잘못된 것은 없습니다.
malloc()
(또는 할당 된 개체에 속하는 경우).
이 책 에서 이것을 인용하고 싶습니다 .
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을 전달하는 것은 단순히 기본값을 사용합니다. 어느 쪽이든 작동 하지만 일반적으로 동적 (후자) 방법을 사용합니다.
기본 뮤텍스 속성이 적절한 경우 PTHREAD_MUTEX_INITIALIZER 매크로를 사용하여 뮤텍스를 초기화 할 수 있습니다.
뮤텍스에 대한 속성을 지정하려면 동적 초기화 ........로 이동하십시오.
이 효과는 오류 검사가 수행되지 않는다는 점을 제외하면 매개 변수 attr이 NULL로 지정된 pthread_mutex_init () 호출에 의한 동적 초기화와 동일합니다.