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

时间:2018-03-13 18:03:54

标签: c++ multithreading producer-consumer

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

  • situation可以随时升起
  • 应用程序应该在单个位置最多处理situation(它可能会使其未处理)

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

  1. 使用包含situations内部队列的factoree传递对象工厂。然后,在sub_main内定期轮询对象以获取新situations。轮询对象从队列中删除。当应用程序决定它不会处理特定位置的情况时,它可以将其移回全局situations队列,并且下一个构造的factoree将获得situation(因此可以在{{1}中的其他位置处理它})
  2. 类似情况,但不是轮询,而是使用lambda函数根据需要更新sub_main内的局部变量。此版本不使用连续轮询,但可读性较差
  3. 两者似乎都有点复杂,我想知道我是否错过了一个更简单的解决方案。问题是sub_main正在我的图书馆外实施,我正在为最终用户提供sub_main

1 个答案:

答案 0 :(得分:1)

我最终使用了@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是轻量级对象,它将在析构函数中取消注册处理程序。