将数据从不同的线程传递给函数
Passing data to function from different thread
我的 C++ 11 应用程序中有一个长时间运行的函数,本质上是sub_main
.我需要通知此功能有关在不同线程中situation
上升的信息。要求:
situation
可以随时上升- 应用程序最多应该在一个位置处理
situation
(它也可以不处理) - 它不需要超快,也不需要执行不延迟
到目前为止,我考虑了两个选项:
- 传递包含内部
situations
队列的因子的对象工厂。然后,在sub_main
内定期轮询对象以获取新situations
。轮询的对象将从队列中删除。当应用程序决定它不会处理特定位置的情况时,它可以将其移回全局situations
队列,下一个构造因子将获得situation
(因此它可以在sub_main
的其他地方处理) - 类似的情况,但不是轮询,而是使用 lambda 函数根据需要更新
sub_main
内部的局部变量。此版本不使用连续轮询,但可读性较差
两者似乎都有点复杂,我想知道我是否错过了更简单的解决方案。问题是sub_main
正在我的图书馆之外实施,我正在向最终用户提供我的situations
我最终使用了@PhilBrubaker和责任链的建议:
void sub_main(std::shared_ptr<situation_register> situation_register)
{
std::unique_ptr<handler_instance> instance =
situation_register->register(priority::main, [=](situation* s)
{
switch(s->get_type())
{
case situation::screensaver:
s->get<situation_screensaver>()->prevent();
s->mark_as_handled();
break;
}
});
}
在这种情况下,如果函数没有明确表示处理了situation
,它将被传递给下一个注册的处理程序(它们根据priority
排序)。handler_instance
是轻量级对象,将在其析构函数中取消注册处理程序。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- C++使用params创建线程函数会导致转换错误
- 为什么std::async使用同一个线程运行函数
- 使用 std::string () const 函数启动线程或未来
- C++线程中,没有重载函数接受 X 参数
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将类的成员函数传递给线程
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 启动类函数作为失去引用的线程
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 类成员在构造函数(线程)之后更改地址
- C++无限依次运行两个函数(线程)
- c++将各种参数传递给父类构造函数(线程c++11)