线程退出时通知Waiters

Notify Waiters at Thread Exit

本文关键字:Waiters 通知 退出 线程      更新时间:2023-10-16

考虑以下示例。假设您有一个生产者和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...
}

以上保证有效吗?我想避免引入布尔标志,或者更好的是,引入另一个新的promise/future对来通知并让读者知道生产者退出的原因。

基本上,当注册到boost::this_thread::at_thread_exit的函数通知读者时,我不确定与packaged_task相关联的未来是否可以被视为准备就绪。在我的情况下,这将简化代码(而不是将新的promise传递给生产者线程)。如果你有更好的想法,请告诉我。

是的,这会起作用。

特别是

基本上,当boost::this_thread::at_thread_exit 注册的功能通知读者时,我不确定与package_task相关的未来是否可以被视为准备就绪

他们可以。packaged_task是线程函数。当Boost Thread的thread_proxy实现执行tls_destructor(包括at_thread_exit钩子)时,packaged_task已经返回,承诺已经实现->共享的未来已经准备好。