pthread 대기 조건 주변에서 while loop이 필요한 이유는 무엇입니까?
pthread와 wait 조건을 배우고 있습니다.일반적인 대기 스레드는 다음과 같습니다.
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
내가 이해할 수 없는 것은 왜 라인이while(!condition)
를 사용해도 필요합니다.pthread_cond_signal()
실마리를 깨우려고.
내가 만약 그것을 사용한다면 나는 이해할 수 있다.pthread_cond_broadcast()
모든 대기 스레드를 웨이크업하고 그 중 하나가 뮤텍스를 잠금 해제하기 전에 상태를 다시 false로 만들 수 있기 때문에 상태를 테스트해야 합니다(그러면 실행이 해당 시점에서 실행되지 않아야 하는 다른 웨이크업 스레드로 전송됨).하지만 만약 내가 사용한다면pthread_cond_signal()
나는 한 가닥만 깨우니까 조건이 맞는 게 틀림없어.코드는 다음과 같습니다.
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
일어날 수 있는 가짜 신호에 대해 읽었어요.이것이 이유입니까?내가 왜 가짜 싱글을 가져야 하지?아니면 제가 모르는 게 또 있나요?
신호 코드는 다음과 같습니다.
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
pthread_cond_wait를 while 루프에 넣는 진짜 이유는 스플리어스 웨이크업 때문이 아닙니다.조건 변수에 스플리어스 웨이크업이 없는 경우에도 일반적인 유형의 오류를 검출하려면 루프가 필요합니다.왜일까요?여러 스레드가 같은 조건으로 대기할 경우 어떤 일이 발생할 수 있는지 고려합니다.
Thread 1 Thread 2 Thread 3
check condition (fails)
(in cond_wait) unlock mutex
(in cond_wait) wait
lock mutex
set condition
signal condvar
unlock mutex
lock mutex
check condition (succeeds)
do stuff
unset condition
unlock mutex
(in cond_wait) wake up
(in cond_wait) lock mutex
<thread is awake, but condition
is unset>
여기서의 문제는 대기하기 전에 스레드가 뮤텍스를 해제해야 하며, 잠재적으로 스레드가 대기 중인 모든 것을 다른 스레드가 '스틸'할 수 있다는 것입니다.이 조건에서는 1개의 스레드만 대기할 수 있는 것이 보증되지 않는 한 스레드가 웨이크업 상태일 때 조건이 유효하다고 가정하는 것은 올바르지 않습니다.
상태를 확인하지 않는다고 가정해 봅시다.그러면 보통 다음과 같은 문제가 발생하는 것을 피할 수 없습니다(적어도 코드 한 줄에서는 피할 수 없습니다).
Sender Receiver
locks mutex
sets condition
signals condvar, but nothing
is waiting so has no effect
releases mutex
locks mutex
waits. Forever.
물론 두 번째 코드 예제에서는 다음을 수행하여 이를 방지할 수 있습니다.
pthread_mutex_lock(&m);
if (!condition) pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
그렇다면 수신자가 최대 1명밖에 없는 경우, 그리고 수신자가 최대 1명일 경우cond_signal
그것을 깨울 수 있는 유일한 것은 조건이 설정되었을 때만 깨우므로 루프가 필요하지 않습니다.nos는 두 번째 "if"가 사실이 아닌 이유를 다룹니다.
언급URL : https://stackoverflow.com/questions/1136371/why-is-a-while-loop-needed-around-pthread-wait-conditions
'programing' 카테고리의 다른 글
이중 정밀도 - 소수점 이하 (0) | 2022.08.12 |
---|---|
Vue + Vuex를 사용하여 렌더링하기 전에 개체의 속성을 상태로 가져올 수 없습니다. (0) | 2022.08.12 |
Java -D 명령줄 매개 변수의 올바른 사용 (0) | 2022.08.11 |
오류: 'optionalChaining' 실험 구문은 현재 지원되지 않지만 다음과 같습니다. (0) | 2022.08.11 |
Eclipse .classpath / .프로젝트 파일에는 무엇이 있습니까? (0) | 2022.08.11 |