木头云
木头云
如果内存够用的话,你可以用`chan`,这是一个单向通道,只能单收单发。 服务端每个连接线程都使用 receiver 模式 connect 一个这样的通道,客户端则使用 sender 模式。 如果希望尽量节省内存,你可以直接用 `channel`,它相当于 `chan`,它能支持多个客户端(也就是 sender)同时给一个服务端(receiver)发送数据。 在使用时需要注意,因为所有的数据是发送到一个通道上的,因此数据的分派需要你自己来做。 建议通过一个线程拿取消息,再分派到合适的工作队列/工作线程上做具体的处理。 PS:除非数据包不大于`data_length`,否则不要使用`chan`,当前这个模式存在bug(见 [issue-46](https://github.com/mutouyun/cpp-ipc/issues/46))。
channel 自身不是线程安全的,每个线程持有自己的 channel,然后 connect 到同一个 name 上就可以了。 同一个 channel 上的所有接收者是抢占式的,你需要自己做分发。 如果你需要 dispatch 的话,使用不同的 name 就可以了(类似 pub-sub),而 channel 的 name,就相当于 topic。
你需要一个序列化库,比如 protobuf、capnp、flatbuf,你可以参考下这些库。 这个库里的序列化实现也可以参考下:https://github.com/qicosmos/rest_rpc
共享内存在不同进程里的地址不一定相同,因此你无法直接将指针传递出去,你需要一个类似 boost::flat_buffer 的东西将内存内容平坦化。 除非你的数据本身就是可平凡拷贝的(is_trivially_copyable),你可以免去序列化的步骤。 目前的接口在发送时怎样都得拷贝一次数据。如果不想拷贝,就需要直接使用共享内存(而不是new/malloc)来构造自己的对象,之后通过 ipc 将它的“句柄”发出去。 由于共享内存的打开和关闭也是耗时操作,所以你需要自己建立一个共享内存池来做缓存。 Jsoncpp的性能是很低的,因为它本就不是为性能考虑的。需要性能的话,首先就不能考虑json,而应该使用idl。
用 signal 捕捉一下,然后在触发的时候把调用栈打出来看看
``` c++ std::vector const datas = { "hello!", //"foo", //"bar", //"ISO/IEC", //"14882:2011", //"ISO/IEC 14882:2017 Information technology - Programming languages - C++", //"ISO/IEC 14882:2020", //"Modern C++ Design: Generic Programming and Design...
可能是send 在tm = 0的时候的bug?我最近比较忙,等我有空了看看 你试试把tm参数改大一点,看看还有没有这个问题
可以。 但要注意: - send目前并不是zero-copy的(recv是),数据包太大还是会有一定的拷贝成本。 - 请及时完成recv的处理,否则send太快导致消息堆积,会严重影响性能,并增加内存占用(因为内存池会cache尚未及时消费的数据包)
有后续的优化计划,但我需要把内部的内存池开放到外部来。 现在内部内存池太简单了,不足以支撑通用内存分配。
支持,用route。