【问题标题】:Signal and Slot vs Multithreading in Boost LibraryBoost 库中的信号和插槽与多线程
【发布时间】:2009-10-19 22:50:46
【问题描述】:

我在 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();

输出: 你好,世界!

【问题讨论】:

    标签: c++ multithreading boost signals-slots


    【解决方案1】:

    第一季度:
    调用是序列化的。信号在内部做的事情被大大简化了:

    foreach connection:
      call handler
    

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

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

    【讨论】:

      【解决方案2】:

      Q1:你是对的。将 my answer 修复为您引用的 the question 以反映这一点。

      Q2:您似乎对应该线程化的内容感到困惑。在发射/捕获过程中,包含代码的是插槽。所以如果你想同时运行代码,你应该把放在不同的线程中。

      Qt 支持这种行为(实际上不知道 boost),并且在 qt 手册中有 a chapter 解释说,对于这种行为,您很可能需要“排队处理”。但是你必须在执行槽代码的线程中有“事件循环”的概念(因为你不能只告诉工作线程“嘿,停止做你的事情,改为这样做!”)。

      如果您不想等待,则必须直接在槽代码中生成线程。而且您不应该忘记在两个插槽都可以访问的代码中使用某种“等待”功能。顺便说一句,boost 和 Qt 都有很好的系统线程库包装器,可以轻松完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 2013-11-13
        • 2014-12-18
        相关资源
        最近更新 更多