-
Notifications
You must be signed in to change notification settings - Fork 385
def.h
mutouyun edited this page Dec 9, 2025
·
2 revisions
#include "libipc/def.h"
定义IPC库的基本类型、常量和策略标志。这是库的核心定义文件。
using byte_t = std::uint8_t;字节类型,用于原始数据操作。
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; };模板结构,用于根据位数获取相应的无符号整数类型。
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) |
enum class relat {
single, // 单个
multi // 多个
};用于指定生产者和消费者的数量关系。
| 枚举值 | 说明 |
|---|---|
single |
单个生产者或单个消费者 |
multi |
多个生产者或多个消费者 |
enum class trans {
unicast, // 单播
broadcast // 广播
};用于指定消息的传输方式。
| 枚举值 | 说明 |
|---|---|
unicast |
单播:每条消息只被一个接收者消费 |
broadcast |
广播:每条消息被所有接收者接收 |
template <relat Rp, relat Rc, trans Ts>
struct wr {};生产者-消费者策略标志模板,组合生产者关系、消费者关系和传输模式。
| 模板参数 | 说明 |
|---|---|
Rp |
生产者关系(relat::single 或 relat::multi) |
Rc |
消费者关系(relat::single 或 relat::multi) |
Ts |
传输模式(trans::unicast 或 trans::broadcast) |
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");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"); // 只有一个接收者会收到- 全局常量定义 - 详细的常量说明
- ipc.h - 主IPC头文件
- ipc::route - 单写多读路由
- ipc::channel - 多写多读通道
- namespace ipc - ipc命名空间
-
invalid_value常用于表示无限超时,在wait、recv等函数中使用 -
data_length决定了小消息的大小,修改它会影响性能和内存使用 -
large_msg_cache不能超过255,这是内部实现的限制 - 选择合适的策略组合可以优化性能和资源使用