programing

pthread 대기 조건 주변에서 while loop이 필요한 이유는 무엇입니까?

newsource 2022. 8. 11. 22:59

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