2017-02-23 4 views
2

여러 스레드로 구성된 첫 번째 구성 요소가 잠긴 잠금을 기다리고 두 번째 구성 요소가 잠금을 수신하고 잠금을 해제 할 때 두 구성 요소가 사용하는 잠금을 구현할 수있는 방법이 있습니까? 신호를 기다리는 다른 모든 스레드에 신호를 보냅니 까?잠금 해제시 여러 스레드를 알리는 하나의 잠금

크로스 플랫폼이어야하며 (C로 구현 됨)

그런 것들을 디자인 할 방법이 있습니까?

+0

대기중인 경우 해당 스레드에 신호를 보내는 시점은 무엇입니까? – StoryTeller

+0

자물쇠가 아닌 다른 것을하기 위해 자물쇠를 사용하지 마십시오. 신호를 보내려는 경우 세마포어, 조건 변수 또는 기타 적절한 것을 사용하십시오 –

+0

이 스레드는 두 번째 구성 요소가 완료 될 때까지 기다리고 작업이 완료되면 계속 작업 할 수 있습니다. – Drxxd

답변

1

대상 시스템이라고 가정 할 때 POSIX 및 Windows 시스템에서 사용할 수있는 교차 플랫폼 솔루션은 하나도 없습니다.

사용법

#include <pthread.h> 

int pthread_cond_broadcast(pthread_cond_t *cond); 
int pthread_cond_signal(pthread_cond_t *cond); 

설명

이 기능이 해제된다 스레드 : POSIX의 시스템에서

모든 대기 스레드를 해제하는 조건 변수를 사용하고 pthread_cond_broadcast() 전화 조건 변수에서 차단되었습니다.

pthread_cond_broadcast() 함수는 현재 cond 변수 지정된 조건에서 차단 모든 스레드를 차단한다.

... Windows에서

, you can use WakeAllConditionVariable :

웨이크 지정된 조건 변수를 기다리는 모든 스레드.

구문

C++

VOID WINAPI WakeAllConditionVariable(
    _Inout_ PCONDITION_VARIABLE ConditionVariable 
); 

그것은 Windows에서 POSIX 시스템 및 Windows 조건 변수에 POSIX 조건 변수를 래핑 자신의 크로스 플랫폼 조건 변수 래퍼를 작성하는 것을 어렵지 않다 시스템.

+0

쿨, 그게 내 문제를 해결하는 것 ..이 상태 변수가 작동하려면 각 스레드에 대한 잠금을 생성해야합니다 (아무 것도하지 않겠습니다). 그런데 이러한 조건 변수에 대한 시간 제한 메커니즘이 있습니까 (POSIX?) – Drxxd

+0

Nvm, "pthread_cond_timedwait"가 조건 변수에 시간 초과가 있으며 여전히 잠금을 사용해야하는 것으로 보입니다. 아무것도하지 마세요. – Drxxd

+0

POSIX 조건 변수에 필요한 뮤텍스는 "아무 것도하지 않습니다". POSIX 조건 변수를 사용하는 방법에 대한 많은 예가 있습니다 : https://www.google.com/search?q=pthread_cond_wait+example –