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

Passing data to function from different thread

我的 C++ 11 应用程序中有 long-运行 函数,本质上是 sub_main。我需要通知此函数有关 situation 在不同线程中出现的情况。要求:

截至目前,我考虑了两个选项:

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