线程退出时通知Waiters
Notify Waiters at Thread Exit
考虑以下示例。假设您有一个生产者和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
已经返回,承诺已经实现->共享的未来已经准备好。
相关文章:
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 如何在点击通知时捕获用户的点击操作
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 如何在不设置值的情况下通知 c++ 未来?
- 使用 ISdigit 通知任何检测到的非法字符
- Qt:如何通知对象已建立涉及它的信号槽连接
- 提升进程间named_condition_any不通知
- Windows Toast 通知不适用于 MS CPP 示例代码
- C++ Poco - 如何创建通知队列的向量?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++ Windows 通知:使用依赖模板名称
- C++ Poco - 如何向特定线程发送通知/消息?
- 通知 Windows 系统应用程序字体已被卸载/删除
- 线程退出时通知Waiters