Skip to content
mutouyun edited this page Dec 9, 2025 · 2 revisions

def.h

#include "libipc/def.h"

定义IPC库的基本类型、常量和策略标志。这是库的核心定义文件。

包含的内容


类型定义

byte_t

using byte_t = std::uint8_t;

字节类型,用于原始数据操作。

uint

template <std::size_t N>
struct uint;

template <> struct uint<8 > { using type = std::uint8_t ; };
template <> struct uint<16> { using type = std::uint16_t; };
template <> struct uint<32> { using type = std::uint32_t; };
template <> struct uint<64> { using type = std::uint64_t; };

模板结构,用于根据位数获取相应的无符号整数类型。

uint_t

template <std::size_t N>
using uint_t = typename uint<N>::type;

类型别名,方便使用指定位数的无符号整数类型。

使用示例

ipc::uint_t<32> value = 42;  // 等同于 std::uint32_t value = 42;
ipc::uint_t<64> big_value = 1234567890ULL;

全局常量

详见:全局常量定义

超时和无效值

enum : std::uint32_t {
    invalid_value   = (std::numeric_limits<std::uint32_t>::max)(),
    default_timeout = 100, // ms
};
常量 说明
invalid_value 最大uint32值 表示无效值或无限超时
default_timeout 100 默认超时时间(毫秒)

数据传输常量

enum : std::size_t {
    data_length     = 64,
    large_msg_limit = data_length,
    large_msg_align = 1024,
    large_msg_cache = 32,
};
常量 说明
data_length 64 循环队列中每个数据包的大小(字节)
large_msg_limit 64 大消息阈值。超过此大小使用临时共享内存
large_msg_align 1024 大消息对齐大小
large_msg_cache 32 大消息临时共享内存缓存池大小(不能超过255)

策略枚举

relat(关系多重性)

enum class relat {
    single,   // 单个
    multi     // 多个
};

用于指定生产者和消费者的数量关系。

枚举值 说明
single 单个生产者或单个消费者
multi 多个生产者或多个消费者

trans(传输模式)

enum class trans {
    unicast,     // 单播
    broadcast    // 广播
};

用于指定消息的传输方式。

枚举值 说明
unicast 单播:每条消息只被一个接收者消费
broadcast 广播:每条消息被所有接收者接收

策略标志

wr<Rp, Rc, Ts>

template <relat Rp, relat Rc, trans Ts>
struct wr {};

生产者-消费者策略标志模板,组合生产者关系、消费者关系和传输模式。

模板参数 说明
Rp 生产者关系(relat::singlerelat::multi
Rc 消费者关系(relat::singlerelat::multi
Ts 传输模式(trans::unicasttrans::broadcast

relat_trait

template <typename WR>
struct relat_trait;

template <relat Rp, relat Rc, trans Ts>
struct relat_trait<wr<Rp, Rc, Ts>> {
    constexpr static bool is_multi_producer = (Rp == relat::multi);
    constexpr static bool is_multi_consumer = (Rc == relat::multi);
    constexpr static bool is_broadcast      = (Ts == trans::broadcast);
};

策略特征萃取器,用于在编译期查询策略标志的特性。

静态成员 说明
is_multi_producer 是否为多生产者
is_multi_consumer 是否为多消费者
is_broadcast 是否为广播模式

使用示例

using my_policy = ipc::wr<ipc::relat::multi, ipc::relat::multi, ipc::trans::broadcast>;

static_assert(ipc::relat_trait<my_policy>::is_multi_producer, "Should be multi producer");
static_assert(ipc::relat_trait<my_policy>::is_broadcast, "Should be broadcast");

前缀标签

prefix

struct prefix {
    char const *str;
};

通道名称前缀标签,用于在IPC通道名称前添加前缀。

使用示例

ipc::prefix pref{"my_app_"};
ipc::route rt{pref, "channel1"};  // 实际名称为 "my_app_channel1"

使用组合

预定义的策略组合

库中常用的策略组合:

// 单写多读 + 广播(ipc::route)
using route_policy = wr<relat::single, relat::multi, trans::broadcast>;

// 多写多读 + 广播(ipc::channel)
using channel_policy = wr<relat::multi, relat::multi, trans::broadcast>;

// 多写多读 + 单播(工作队列)
using queue_policy = wr<relat::multi, relat::multi, trans::unicast>;

// 单写单读 + 单播(点对点通道)
using pipe_policy = wr<relat::single, relat::single, trans::unicast>;

自定义通道

使用这些定义可以创建自定义的IPC通道:

// 定义工作队列:多生产者、多消费者、单播
using work_queue = ipc::chan<ipc::relat::multi, ipc::relat::multi, ipc::trans::unicast>;

work_queue wq{"my_work_queue"};
wq.send("Task 1");  // 只有一个接收者会收到

相关文档


注意事项

  • invalid_value常用于表示无限超时,在waitrecv等函数中使用
  • data_length决定了小消息的大小,修改它会影响性能和内存使用
  • large_msg_cache不能超过255,这是内部实现的限制
  • 选择合适的策略组合可以优化性能和资源使用

Clone this wiki locally