【链接】https://github.com/ispringtech/FastSignals
FastSignals 是一个 C++ 信号/槽(Signal/Slot)库,提供了线程安全的事件处理能力。类似于 Boost.Signals2 或 Qt 的信号槽机制,但专注于 高性能 和 低开销。它适用于需要高效事件处理的场景,比如游戏引擎、高频交易系统或嵌入式开发。
核心组件

-
信号类 (
signal.h)-
实现了一对多事件通知的观察者模式
-
支持void和非void返回类型
-
使用组合器模式处理多个槽函数的返回值
-
提供连接管理和线程安全操作
-
-
连接管理 (
connection.h)-
connection: 基本连接句柄 -
advanced_connection: 支持阻塞回调执行 -
scoped_connection: 销毁时自动断开连接 -
shared_connection_block: 临时阻塞槽函数执行
-
-
函数包装器 (
function.h,function_detail.h)-
高效替代
std::function,带有小缓冲区优化 -
以最小开销支持各种可调用类型
-
提供类型安全的调用
-
-
线程安全
-
spin_mutex.h: 轻量级同步原语 -
线程安全的断开连接操作
-
跨线程的安全信号调用
-
关键特性
-
内存安全
-
弱指针绑定(
bind_weak.h)防止悬空引用 -
自动清理已断开的槽函数
-
小缓冲区优化实现高效槽函数存储
-
-
灵活的调用
-
支持const和非const成员函数
-
适当处理引用或值参数
-
可自定义非void槽函数的结果组合
-
-
性能优化
-
低竞争场景下的自旋锁
-
最小化模板膨胀
-
高效的槽函数存储和调用
-
-
高级功能
-
可阻塞的连接
-
信号到信号的连接
-
作用域连接管理
-
使用示例
基本信号/槽连接
is::signals::signal<void(int)> sig;
auto conn = sig.connect([](int x) { std::cout << x; });
sig(42); // 输出"42"
成员函数连接
struct MyClass {
void method(int x) { /*...*/ }
};
auto obj = std::make_shared<MyClass>();
is::signals::signal<void(int)> sig;
auto conn = sig.connect(is::signals::bind_weak(&MyClass::method, obj));
高级可阻塞连接
is::signals::signal<void()> sig;
auto adv_conn = sig.connect([](){ /*...*/ }, is::signals::advanced_tag{});
is::signals::shared_connection_block blocker(adv_conn);
sig(); // 阻塞时槽函数不会被调用
信号链式连接
is::signals::signal<void()> sig1, sig2;
sig1.connect(sig2); // 连接信号到信号
sig1(); // 同时会调用sig2
该库提供了一个健壮的、线程安全的信号和槽实现,特别关注内存安全和性能。设计上既支持简单用法也支持高级用法,同时保持高效性。
signal类
#pragma once
#include "combiners.h"
#include "connection.h"
#include "function.h"
#include "signal_impl.h"
#include "type_traits.h"
#include <type_traits>
#if defined(_MSC_VER)
# include "msvc_autolink.h"
#endif
namespace is::signals
{
template <clas

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



