将数据从不同的线程传递给函数

Passing data to function from different thread

本文关键字:函数 线程 数据      更新时间:2023-10-16

我的 C++ 11 应用程序中有一个长时间运行的函数,本质上是sub_main.我需要通知此功能有关在不同线程中situation上升的信息。要求:

  • situation可以随时上升
  • 应用程序最多应该在一个位置处理situation(它也可以不处理)
  • 它不需要超快,也不需要执行不延迟

到目前为止,我考虑了两个选项:

  1. 传递包含内部situations队列的因子的对象工厂。然后,在sub_main内定期轮询对象以获取新situations。轮询的对象将从队列中删除。当应用程序决定它不会处理特定位置的情况时,它可以将其移回全局situations队列,下一个构造因子将获得situation(因此它可以在sub_main的其他地方处理)
  2. 类似的情况,但不是轮询,而是使用 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是轻量级对象,将在其析构函数中取消注册处理程序。