Boost.Fiber Synchronization Condition Variables


Synchronization Condition Variables

📦 Synopsis - 개요

⚛ "enum class" 설명 (chatgpt)

condition_variable 클래스는 파이버가 다른 파이버의 알림을 기다리는 메커니즘을 제공합니다.
파이버가 대기에서 깨어나면 적절한 조건이 이제 참인지 확인하고 그렇다면 계속 진행합니다.
조건이 true가 아닌 경우 파이버 호출은 대기를 다시 시작하기 위해 다시 기다립니다.
가장 간단한 경우 이 조건은 부울 변수일 뿐입니다.
'lk'가 condition_variable::wait()에 전달된다는 점에 유의하세요.
wait()는 조건 변수를 기다리는 파이버 세트에 파이버를 원자적으로 추가하고 뮤텍스를 잠금 해제합니다.
파이버가 깨어나면 wait() 호출이 반환되기 전에 뮤텍스가 다시 잠깁니다.
이를 통해 다른 파이버는 공유 데이터를 업데이트하기 위해 뮤텍스를 획득할 수 있으며 조건과 관련된 데이터가 올바르게 동기화되도록 할 수 있습니다.

wait_for_data_to_process()를 다음과 같이 작성할 수 있습니다. 그 동안 다른 파이버는 'data_ready'를 true로 설정한 다음, condition_variable 조건에 대해 condition_variable::notify_one() 또는 condition_variable::notify_all()을 호출하여 하나의 대기 파이버 또는 모든 대기 파이버를 각각 깨웁니다. 공유 데이터가 업데이트되기 전에 동일한 뮤텍스가 잠기지만, condition_variable::notify_one() 호출 전체에서 뮤텍스를 잠글 필요는 없습니다.

Boost.Fiber에서 제공하는 동기화 개체를 사용하여 다른 스레드에서 실행되는 파이버를 동기화할 수 있으므로 잠금이 중요합니다.

Boost.Fiber는 'condition_variable'과 'condition_variable_any'를 모두 제공합니다.
'boost::fibers::condition_variable'은 'std::unique_lock< boost::fibers::mutex >'에서만 기다릴 수 있는 반면 'boost::fibers::condition_variable_any'는 사용자 정의 잠금 유형을 기다릴 수 있습니다.

📦 No Spurious Wakeups - 가짜 깨우기 없음

⚛ "No Spurious Wakeups" 설명 (chatgpt)

'condition_variable'이나 'condition_variable_any' 모두 가짜 깨우기 대상이 아닙니다.
condition_variable::wait()는 condition_variable::notify_one() 또는 condition_variable::notify_all()이 호출될 때만 깨어날 수 있습니다.   그럼에도 불구하고 wait( lock, predicate ) 오버로드 중 하나를 사용하는 것이 현명합니다.

'std::queue'의 항목을 처리하는 소비자 파이버 세트를 생각해 보세요.
대기열은 일련의 생산자 파이버에 의해 지속적으로 채워집니다.
소비자 파이버는 대기열이 empty()으로 유지되는 한 'condition_variable'를 합리적으로 기다릴 수 있습니다.

생산자 파이버는 항목을 한꺼번에 대기열에 push()할 수 있기 때문에 condition_variable::notify_one() 대신 condition_variable::notify_all()을 호출합니다.
⚛ bursts(한꺼번에) 설명 (chatgpt)
그러나 특정 소비자 파이버는 condition_variable::wait()에서 깨어나서 대기열이 empty()을 찾을 수도 있습니다.   왜냐하면 다른 소비자 파이버는 이미 보류 중인 모든 항목을 처리했을 수 있기 때문입니다.

(See also spurious wakeup.)
https://www.boost.org/doc/libs/1_85_0/libs/fiber/doc/html/fiber/rationale.html#spurious_wakeup

📦 Enumeration cv_status

시간 초과 여부에 관계없이 시간이 지정된 대기 작업이 반환될 수 있습니다.

🔧 no_timeout

• Effects: 조건 변수는 'notify_one' 또는 'notify_all'을 사용하여 활성화되었습니다.

🔧 timeout

• Effects: 조건 변수가 시간 초과로 인해 활성화되었습니다.

📦 Class condition_variable_any

📦 Class condition_variable

⚛ 원문
Email 답글이 올라오면 이메일로 알려드리겠습니다.