zeromq源码学习——ctx创建
来源:互联网 发布:唯一网络被收购 编辑:程序博客网 时间:2024/05/29 18:19
ctx_t封装了与zeromq库相关的全部全局状态。当使用zeromq时,需要调用zmq_ctx_new函数创建一个ctx_t对象,并返回该对象,没有对context对象进行初始化。其中一个重要的变量starting,它为true时,表示context创建,但是未创建任何一个socket对象。
当创建地一个socket时,会先初始化context对象,来准备运行环境。
void *zmq_socket (void *ctx_, int type_){ if (!ctx_ || !((zmq::ctx_t *) ctx_)->check_tag ()) { errno = EFAULT; return NULL; } zmq::ctx_t *ctx = (zmq::ctx_t *) ctx_; zmq::socket_base_t *s = ctx->create_socket (type_); return (void *) s;}
通过ctx_t中的create_socke函数创建socket:
zmq::socket_base_t *zmq::ctx_t::create_socket (int type_){ scoped_lock_t locker(slot_sync); if (unlikely (starting)) { starting = false;//确保context对象只会初始化一次 opt_sync.lock (); int mazmq = max_sockets;//最大sockets数量 int ios = io_thread_count;//io线程数量 opt_sync.unlock (); slot_count = mazmq + ios + 2;//槽的总数,sockets+io+term+reaper slots = (i_mailbox **) malloc (sizeof (i_mailbox*) * slot_count); alloc_assert (slots); //初始化term线程的一些基础设施,用于销毁context时,执行一些清理工作 slots [term_tid] = &term_mailbox; //创建reaper线程,并启动(还不清楚reaper线程的作用) reaper = new (std::nothrow) reaper_t (this, reaper_tid); alloc_assert (reaper); slots [reaper_tid] = reaper->get_mailbox (); reaper->start (); //创建IO线程,并启动,可以启动多个IO线程 for (int i = 2; i != ios + 2; i++) { io_thread_t *io_thread = new (std::nothrow) io_thread_t (this, i); alloc_assert (io_thread); io_threads.push_back (io_thread); slots [i] = io_thread->get_mailbox (); io_thread->start (); } //初始化未使用的socket槽索引 for (int32_t i = (int32_t) slot_count - 1; i >= (int32_t) ios + 2; i--) { empty_slots.push_back (i); slots [i] = NULL; } } //context已经处于销毁状态,则不能创建socket if (terminating) { errno = ETERM; return NULL; } //socket已经达到最大数量,不能创建 if (empty_slots.empty ()) { errno = EMFILE; return NULL; } //为socket选择一个槽索引 uint32_t slot = empty_slots.back (); empty_slots.pop_back (); // Generate new unique socket ID. int sid = ((int) max_socket_id.add (1)) + 1; //创建socket,并注册mailbox socket_base_t *s = socket_base_t::create (type_, this, slot, sid); if (!s) { empty_slots.push_back (slot); return NULL; } sockets.push_back (s); slots [slot] = s->get_mailbox (); return s;}
阅读全文
0 0
- zeromq源码学习——ctx创建
- zeromq源码学习——yqueue
- zeromq源码学习——ypipe
- zeromq源码学习——array
- 风车——ctx.rotate(angle),ctx.translate(dx, dy)
- zeromq应用学习(1)——编译zeromq的示例程序
- zeromq 学习
- zeroMQ学习
- zeromq学习
- zeromq 学习
- ZeroMQ 学习
- ZeroMQ学习
- zeromq源码阅读 —— Msg.hpp & Msg.cpp 的 msg_t (zmq中的消息)
- ZeroMQ 源码阅读
- 学习Hibernate源码——配置文件解析,SessionFactory创建
- 学习Hibernate源码——配置文件解析,SessionFactory创建
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- VC++深入详解学习笔记
- 条形码类型及常见条形码介绍
- 【知识整理】聊聊web app开发的那些事
- [centos] network 无法重启的几种解决方法
- SpringMvc+Mybatis多数据源切换
- zeromq源码学习——ctx创建
- 【C#】 Debug运行文件只能运行一个(不能打开多个)
- gdb---watch使用方法
- 优化第三方应用被kill后接收广播自启
- 关于Django的模板文件的路径设置templates
- PuTTY (1) Download Putty
- There is no setter for property named 可能产生的原因!
- js中alert的换行问题
- java之动态代理