gpt4 book ai didi

c++ - Boost 库中的信号和槽与多线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:26 24 4
gpt4 key购买 nike

我在 Stackoverflow 上经历过类似的问题,但仍然无法得到好的答案:

  1. how boost implements signals and slots
  2. How signal and slots are implemented

我很困惑这个信号/槽是如何实现的。

Q1:从下面的代码来看,sig连接了两个函数(Hello()和World()),看起来函数是串行调用的,这也暗示着,一个函数(Hello() ) 需要在进入另一个功能(World())之前完成? => 单线程程序

Q2:有没有启用多线程信号/槽?(=> World() 会立即启动,不需要等待 Hello() 完成。)或者如果不推荐,您介意吗告诉我为什么?

Sample codes on Boost website :

struct Hello 
{
void operator()() const { std::cout << "Hello";}
};
struct World
{
void operator()() const { std::cout << ", World!" << std::endl;}
};

boost::signal<void ()> sig;
sig.connect(Hello());
sig.connect(World());
sig();

输出: 你好,世界!

最佳答案

问题一:
这些调用是序列化的。信号在内部所做的事情大大简化了:

foreach connection:
call handler

因此,您不想长时间阻塞处理程序。如果您需要做很多工作,您可以从那里调用它,例如通过为它创建一个线程。

Q2:
boost signals 1 甚至不是线程安全的;信号 2 是,但仍然进行序列化调用。由于信号主要用于事件处理,因此在处理程序中实际上不做太多工作是常见的风格。
因此,将它们称为“并行”并没有真正的好处,这些好处通常不会证明必要线程调用的开销是合理的。

关于c++ - Boost 库中的信号和槽与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1591568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com