Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从不同线程向函数传递数据 我在C++ 11应用程序中有长时间运行的函数,基本上是代码>子ION主< /代码>。我需要将不同线程中出现的情况通知此函数。要求: 情况可以随时升高 应用程序最多只能在单个位置处理情况(也可以不处理) 它不需要非常快,也不需要延迟执行_C++_Multithreading_Producer Consumer - Fatal编程技术网

从不同线程向函数传递数据 我在C++ 11应用程序中有长时间运行的函数,基本上是代码>子ION主< /代码>。我需要将不同线程中出现的情况通知此函数。要求: 情况可以随时升高 应用程序最多只能在单个位置处理情况(也可以不处理) 它不需要非常快,也不需要延迟执行

从不同线程向函数传递数据 我在C++ 11应用程序中有长时间运行的函数,基本上是代码>子ION主< /代码>。我需要将不同线程中出现的情况通知此函数。要求: 情况可以随时升高 应用程序最多只能在单个位置处理情况(也可以不处理) 它不需要非常快,也不需要延迟执行,c++,multithreading,producer-consumer,C++,Multithreading,Producer Consumer,到目前为止,我考虑了两种选择: 通过包含情况的内部队列的factoree传递对象工厂。然后在sub_main内定期轮询对象,以了解新的情况。轮询对象已从队列中删除。当应用程序决定不处理特定位置的情况时,它可以将其移回全局情况队列,然后下一个构造的factoree将获得情况(因此可以在sub_main中的其他位置处理) 类似的情况,但不是轮询,而是使用lambda函数,根据需要更新sub_main中的局部变量。此版本不使用连续轮询,但可读性较差 两者似乎都有点复杂,我想知道我是否错过了一个更简单的

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

  • 通过包含
    情况的内部队列的factoree传递对象工厂
    。然后在
    sub_main
    内定期轮询对象,以了解新的
    情况。轮询对象已从队列中删除。当应用程序决定不处理特定位置的情况时,它可以将其移回全局
    情况
    队列,然后下一个构造的factoree将获得
    情况
    (因此可以在
    sub_main
    中的其他位置处理)
  • 类似的情况,但不是轮询,而是使用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;
                }
            });
    
    
    }
    
    void sub_main(标准::共享情况寄存器)
    {
    std::唯一的\u ptr实例=
    状态寄存器->寄存器(优先级::main,[=](状态*s)
    {
    开关->获取类型()
    {
    案例情况::屏幕保护程序:
    s->get()->prevent();
    s->将_标记为_handled();
    打破
    }
    });
    }
    

    在这种情况下,如果函数没有明确说明处理了
    情况
    ,它将传递给下一个注册的处理程序(它们根据
    优先级进行排序)。
    handler\u实例
    是轻量级对象,将在其析构函数中注销处理程序。

    您可以使用变量和互斥体?@JakeFreeman哪个变量?全局变量?传递变量?哪种类型?您可能想看看。您可能正在描述
    std::promise
    std::future
    的交互作用。我不想使用全局变量。如果有多个线程影响同一个变量,它们就会变得混乱。我要做的是向每个线程传递一个回调函数,并将其用作从线程返回调用方的通知网关。