【问题标题】:Passing data to function from different thread从不同的线程传递数据到函数
【发布时间】:2018-08-22 02:37:12
【问题描述】:

我的 C++ 11 应用程序中有长时间运行的函数,它本质上是 sub_main。我需要通知这个函数situation 在不同的线程中出现。要求:

  • situation可以随时升起
  • 应用程序最多只能在一个地方处理situation(也可以不处理)
  • 它确实不需要在执行中需要超快也不延迟

到目前为止,我考虑了两种选择:

  1. 通过包含situations 内部队列的factoree 传递对象工厂。然后在sub_main 内定期轮询该对象以获取新的situations。轮询对象从队列中移除。当应用程序决定它不会处理特定位置的情况时,它可以将其移回全局situations队列,下一个构造的factoree将获得situation(因此可以在sub_main的其他地方处理)
  2. 类似情况,但不是轮询,而是根据需要使用 lambda 函数更新 sub_main 内部的局部变量。此版本不使用连续轮询,但可读性较差

两者似乎都有点复杂,我想知道我是否错过了更简单的解决方案。问题是sub_main 正在我的库之外实现,我正在向最终用户提供我的situations

【问题讨论】:

  • 你可以使用变量和互斥体吗?
  • @JakeFreeman 哪个变量?全局变量?传递变量?哪种类型?
  • 你可能想看看Chain-of-responsibility pattern
  • 您可能在描述std::promisestd::future 的交互。
  • 我会避免使用全局变量。如果您有多个线程影响同一个变量,它们会变得混乱。我所做的是将回调函数传递给每个线程,并将其用作从线程返回调用者的通知网关。

标签: c++ multithreading producer-consumer


【解决方案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 是轻量级对象,将在其析构函数中取消注册处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2010-10-21
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多