从不同线程向函数传递数据 我在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
中的其他位置处理)
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
的交互作用。我不想使用全局变量。如果有多个线程影响同一个变量,它们就会变得混乱。我要做的是向每个线程传递一个回调函数,并将其用作从线程返回调用方的通知网关。