signals2基于boost的另一个库signals,实现了线程安全的观察者模式。在signals2库中,观察值模式被称为信号/槽(signals and slots),它是一种函数回调机制,一个信号关联了多个插槽,当信号发出去时,所有关联它的插槽都会被调用。许多成熟的软件系统都用到了这种信号/槽机制(另一个常用的是事件处理机制:event / event handler),它可以很好的解耦一组互相协作的类,有的语言甚至直接内建了对它的支持(如C#),signals2以库的形式为C++增加了这个重要的功能。signals2库位于名字空间Boost::signals2,为了使用signals2组件,需要包含头文件<boost/signals2.hpp>,即:
#include <boost/signals2.hpp>
using namespace boost;
与signals的区别:
signals是Boost库中另一个信号/插槽库,实际上signals2的实现是基于signals的。signals2与signals最大的区别是具有线程安全,能够用于多线程环境,而且不需要编译就可以使用。signals2在结构、接口、设计原理等许多方面都模仿了signals,但也有一些很多变化,例如默认信号调用返回是一个optional对象、combiner()函数改为set_combiner()、connection对象不再拥有block()方法等等。
与C#的区别:
signals2中的信号/插槽机制原理上类似于C#语言的event/delegate机制,但是C#的delegate的功能要比signals2弱,它要求精确的类型匹配,也没有合并器的概念,只能返回一个结果。delegate使用operator+=来连接event与delegate,signals2则使用connect()函数。这是因为signals2在设计时认为operator+=并没有带来太多的好处,反而会导致连续使用+=连接、operator-=等其他语义问题。