我的 C++ 11 应用程序中有一个长时间运行的函数,它本质上是 sub_main
。我需要通知此函数有关在不同线程中出现的情况
。要求:
情况
可以随时上升- 应用程序最多只能在一个地方处理
情况
(也可以不处理) - 它不需要执行得超快也不需要延迟
到目前为止,我考虑了两种选择:
- 通过包含
情况
内部队列的factoree传递对象工厂。然后在sub_main
内定期轮询该对象以获取新的情况
。轮询的对象从队列中删除。当应用程序决定它不会处理特定位置的情况时,它可以将它移回全局situations
队列,下一个构造的 factoree 将获得situation
(因此它可以被处理sub_main
中的其他地方) - 类似情况,但不是轮询,而是使用 lambda 函数根据需要更新
sub_main
内的局部变量。此版本不使用连续轮询,但可读性较差
两者似乎都有点复杂,我想知道我是否错过了一个更简单的解决方案。问题是 sub_main
是在我的库之外实现的,我正在向最终用户提供我的情况
最佳答案
我最终使用了@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++ - 将数据传递给来自不同线程的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49262946/