다음 예제를 고려하십시오. 한 명의 생산자와 N 명의 소비자가 데이터를 기다리고 있다고 가정합니다. 데이터가 준비 될 때마다뿐만 아니라 제작자가 어떤 이유 (오류 또는 중단 지점)로 종료 할 때도 고객에게 알리고 싶습니다. 후자의 경우 독자는 물론 종료해야합니다.스레드 출구에서 대기자에게 알리기
// Globals
boost::shared_future<void> future;
boost::condition_variable_any cv;
// Producer
auto producer = [&](){
boost::this_thread::at_thread_exit([&cv]() { cv.notify_all(); });
while (true) {
boost::this_thread::interruption_point(); // might throw
// ...
cv.notify_all();
}
};
boost::packaged_task<void> pkg{producer};
future = pkg.get_future();
thread = boost::thread{std::move(pkg)}; // start
// Reader
while (true) {
// ...
// will the future be ready after the producer has been interrupted?
cv.wait(lock_, [&ready, &future]() { return ready || future.is_ready(); });
if (future.is_ready()) {
future.get(); // throw, whatever has been thrown by the producer
return;
}
// consume, etc...
}
위의 사항이 작동하는 것입니까? 부울 플래그를 도입하는 것을 피하고 싶습니다. 또는 - 더 나은 - 또 다른 새로운 약속/장래의 쌍으로 독자가 제작자가 종료 된 이유를 알리고 독자에게 알릴 수 있습니다.
기본적으로 packaged_task와 연결된 미래가 boost::this_thread::at_thread_exit
으로 등록 된 기능에 의해 통지 될 때 준비가되었다고 나는 확신 할 수 없습니다. 이렇게하면 내 경우에 코드를 단순화 할 수 있습니다 (프로듀서 스레드에 새로운 약속을 전달하는 대신). 더 좋은 아이디어가 있다면 알려주세요.
내 테스트에 따르면 ... – Martin