2016-11-30 7 views
0

이 숙제 문제를 해결하는 데 어려움을 겪고 있습니다. 하나의 스레드에서 x.signal()을 호출하고 나중에 x가 조건 변수이고 x가 세마포어 인 경우 다른 스레드의 x.wait()가 다른 결과를 생성합니까?조건 변수 대 세마포 예

제 생각 엔 x가 조건 변수 또는 세마포어 인 경우이 특별한 경우에는 문제가되지 않습니다.

도움 주셔서 감사합니다.

답변

0

세마포어는 원자 적 연산에 의해 보호되는 상태를 가지며 조건 변수 (CV)는 자체 상태를 가지지 않으며 보호되지도 않습니다. (일반적인 가정은 프로그램 자체가 더 복잡한 공유 상태를가집니다. 정수이므로 "수동으로"유지해야합니다.)

CV를 올바르게 사용하려면 신호 및 대기 작업이 모두 관련 뮤텍스 잠금에 의해 보호되어야합니다. 그렇지 않으면 대기 스레드가 신호을 놓칠 수 있습니다. 따라서 프로그램은 CV에서 적절한 잠금 시퀀스를 보장해야합니다.

한편 세마포어 작업은 개발자로부터 숨겨 및 코드가 간단하고 방법의 이력서 수에 잘못 갈 수 없어,하지만 그것도 매우 구체적인 작업에 매우 간단한/작은 공유 상태를 유지하고 있습니다.

+0

[뮤텍스와 조건부 변수에서 세마포를 만들 수 있습니다.] (http://stackoverflow.com/a/4793662/412080). 둘 다 프로세스 공유가 가능하며 공유 메모리에 배치 될 수 있으므로 프로세스 간 통신 메커니즘을 제공합니다. –

+0

@MaximEgorushkin 확실히, 당신은 다른 것을 만들 수 있습니다 (그것은 성능 과잉입니다),하지만 IPC를 가진 표준/네이티브 CV를보고 싶습니다. pthread_cond_init에 그런 옵션이 보이지 않습니다. – mariusm

+1

프로세스 공유 뮤텍스와 조건 변수가 수십 년 동안 표준으로 사용되었습니다. http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html –