2014-10-24 1 views
0

내가 여기에 다음과 같은 코드를 참조 잠금 조건에 대한 출시 전 : https://docs.python.org/2/library/threading.html#condition-objects어떤 일 후 통보하고

# Consume one item (thread 1) 
cv.acquire() 
while not an_item_is_available(): 
    cv.wait() 
get_an_available_item() 
cv.release() 

# Produce one item (thread 2) 
cv.acquire() 
make_an_item_available() 
cv.notify() 
cv.release() 

내 질문 스레드 1 전에 cv.wait()에서 깨울되지만, cv.notify()이 스레드 2를 호출 할 때입니다 스레드 2는 cv.release()을 호출하고, 스레드 1은 잠금을 획득하지 못합니다 (맞습니까?). 제 질문은 스레드 1에 대한 동작은 cv.notify()을 호출 한 후 스레드 2에서 cv.release()을 호출하기 전에 무엇입니까?

업데이트 :

내가 https://stackoverflow.com/a/17337630/1497720에서 발견,하지만 자바에 대한 :

이 두 데이터 구조체 유지 - 대기 세트 및 항목 세트를. 기다리는 스레드는 대기 세트에 추가되고 고정되며 스레드 은 모니터를 가져 오려고 시도하고 항목 세트에 추가되고 은 고정됩니다. On 스레드는 대기 세트에서 가져온 후 항목 세트에 추가됩니다. 스레드가 잠금을 해제하면 의 스레드가있는 경우 해당 스레드의 잠금을 해제합니다. 이러한 집합은 사실 큐 (링크 된 목록)로 구현 된 이므로 FIFO 단위로 처리됩니다. Condition.notify의 문서에서

답변

0

:

참고 : 잠금을 다시 획득 할 때까지 깨어 스레드가 실제로는 wait() 호출에서 반환하지 않습니다. notify()은 잠금을 해제하지 않으므로 호출자는 잠금을 해제해야합니다.

그래서, cv.notify()를 호출 한 후하지만 cv.release()를 호출하기 전에 행동은 여전히 ​​cv.wait()에서 차단 스레드 1입니다.

0

notify() 및 notifyAll() 메서드는 잠금을 해제하지 않습니다. 즉 깨우기 스레드 또는 스레드는 wait() 호출에서 즉시 반환되지 않지만 notify() 또는 notifyAll()을 호출 한 스레드가 마침내 잠금 소유권을 양도 할 때만 발생합니다.

출처 : https://docs.python.org/2.7/library/threading.html#condition-objects

관련 문제