zeromq的学习笔记

ctx_t

在创建ctx_t时,会设置以下参数
_io_thread_count io线程数默认是1
_max_sockets最大socket数是1023
_starting标识设置为true,此时socket还没有创建
_terminating设置为false,在调用zmq_ctx_term时该标识会设置为true
_tag设置为ZMQ_CTX_TAG_VALUE_GOOD,表示该对象是上下文
_reaper线程设置为null
_max_msgsz消息最大大小为INT_MAX
_blocky设置为true,表示终止时ctx会等待
_ipv6设置为false,不允许ipv6
_zero_copy设置为true,解码使用零拷贝

#define ZMQ_IO_THREADS_DFLT 1
#define ZMQ_MAX_SOCKETS_DFLT 1023

session与engine,session为用户线程与io线程交互的桥梁,两者之间是通过mailbox来交互数据,实际上是通过pipe来交换数据
ctx中的_term_mailbox在terminate方法中,会等待reaper线程发送command_t::done命令,而reapter线程在处理command_t::stop和command_t::reaped命令时,如果其管理的socket_base的个数为0,才会发送command_t::done
command_t::reaped的命令是由谁来下发的呢?
是由socket_base_t下发,在两个地方会下发,start_reaping和in_event方法中,在调用check_destroy方法时
在这里插入图片描述
command_t::stop的命令是由谁来下发的呢?
由reaper自己,在调用stop方法时
在这里插入图片描述
start_reaping什么时候会触发呢?
在socket_base_t调用close方法时,即zmq_close时。会向reaper发送command_t::reap命令,同时将自己作为参数。
在这里插入图片描述
在这里插入图片描述
start_reaping中会调用terminate方法,在process_term方法中会调用process_destroy,socket_base_t中的process_destroy会将_destroyed标识设置为true.

launch_child的理解,在存在从属关系时会调用send_plug,send_own。此时涉及到一些动态分配的指针。在需要销毁时,需要发送send_term等命令来delete

在socket_base触发管道的读写操作时,会调用engine的restart_input和restart_output与io线程中的in_event和out_event同时运行时,不会有多线程竞争问题吗?
session_base绑定的pipe与session_base使用的是同一线程,session_base使用的是io_thread线程中的mail_box,最终调用也是在io_thread线程中,所以不会有多线程竞争问题

engine与文件描述符是一一对应的,即一个fd的读写操作对应一个engine

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值