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

标签 c++ multithreading producer-consumer

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

  • 情况可以随时上升
  • 应用程序最多只能在一个地方处理情况(也可以不处理)
  • 不需要执行得超快也不需要延迟

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

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

相关文章:

java while(true) 轮询队列没有被执行

c++ - 第一次遇到单词时将其存储到动态创建的数组中

c++ - 如何从控件中正确检索 Unicode 文本?

c++ - "..."c的多重定义

c# - 为什么我的多线程比单线程慢?

c++ - 无法使用 C++ 中的列表创建生产者-消费者实例

java - 只有 2 个线程用于调用生产和消费?

c++ - 删除指针而不是变量

Java 在 MainThread.join() 时更新 GUI?

c++ - `shared_ptr::use_count() == 0` 和 `shared_ptr::get() != nullptr` 有可能吗?