原始碼走讀
1.zmq_ctx_new()
//返回ctx_t物件
void *zmq_ctx_new (void)
// create 0mq context.
zmq::ctx_t *ctx = new (std::nothrow) zmq::ctx_t;
if (ctx)
}return ctx;
}
函式返回context(上下文),其實呼叫的是ctx_t物件(例項化)
zmq::ctx_t::ctx_t () :
_tag (zmq_ctx_tag_value_good),
_starting (true),
_terminating (false),
_reaper (null),
_max_sockets (clipped_maxsocket (zmq_max_sockets_dflt)),
_max_msgsz (int_max),
_io_thread_count (zmq_io_threads_dflt),
_blocky (true),
_ipv6 (false),
_zero_copy (true)
主要就是設定初始化的引數;如;_max_sockets = 1024;_io_thread_count = 1;當然還有一些狀態設定等等;
2.zmq_socket()
void *zmq_socket (void *ctx_, int type_)
//強轉
zmq::ctx_t *ctx = static_cast(ctx_);
zmq::socket_base_t *s = ctx->create_socket (type_);
return (void *) s;
}
引數:
void *ctx_;zmq_ctx_new返回的上下文引數;
int type_:socket types.
socket types:
zmq_pair 0
zmq_pub 1
zmq_sub 2
zmq_req 3
zmq_rep 4
zmq_dealer 5
zmq_router 6
zmq_pull 7
zmq_push 8
zmq_xpub 9
zmq_xsub 10
zmq_stream 11
返回值:建立生成的socket
呼叫create_socket()
zmq::socket_base_t *zmq::ctx_t::create_socket (int type_)
// once zmq_ctx_term() was called, we can't create new sockets.
if (_terminating)
// if max_sockets limit was reached, return error.
if (_empty_slots.empty ())
// choose a slot for the socket.
uint32_t slot = _empty_slots.back ();
_empty_slots.pop_back ();
// generate new unique socket id.
//生成新的唯一的套接字id。
int sid = (static_cast(max_socket_id.add (1))) + 1;
// create the socket and register its mailbox.
//建立socket並且註冊郵箱
socket_base_t *s = socket_base_t::create (type_, this, slot, sid);
if (!s)
_sockets.push_back (s);
_slots[slot] = s->get_mailbox ();
return s;
}
呼叫start ()函式:
bool zmq::ctx_t::start ()
catch (const std::bad_alloc &)
//改變了容器的大小,且建立了容器中的物件
_slots.resize (term_and_reaper_threads_count);
// initialise the infrastructure for zmq_ctx_term thread.
_slots[term_tid] = &_term_mailbox;
//建立執行緒
_reaper = new (std::nothrow) reaper_t (this, reaper_tid);
if (!_reaper)
if (!_reaper->get_mailbox ()->valid ())
goto fail_cleanup_reaper;
_slots[reaper_tid] = _reaper->get_mailbox ();
_reaper->start ();
// create i/o thread objects and launch them.
_slots.resize (slot_count, null);
//建立io執行緒並啟動
for (int i = term_and_reaper_threads_count;
i != ios + term_and_reaper_threads_count; i++)
if (!io_thread->get_mailbox ()->valid ())
_io_threads.push_back (io_thread);
_slots[i] = io_thread->get_mailbox ();
io_thread->start ();
}// in the unused part of the slot array, create a list of empty slots.
for (int32_t i = static_cast(_slots.size ()) - 1;
i >= static_cast(ios) + term_and_reaper_threads_count; i--)
_starting = false;
return true;
fail_cleanup_reaper:
_reaper->stop ();
delete _reaper;
_reaper = null;
fail_cleanup_slots:
_slots.clear ();
return false;
}
ZMQ從入門到掌握三
訂閱 發布模式 zeromq的訂閱發布模式是一種單向的資料發布,當客戶端向服務端訂閱訊息之後,服務端便會將產生的訊息源源不斷的推送給訂閱者 特點 1.乙個發布者,多個訂閱者的關係,1 n 2.當發布者資料變化時發布資料,所有訂閱者均能夠接收到資料並處理。這就是發布 訂閱模式。注 使用sub設定乙個訂...
從入門到實踐,快速掌握 Nginx 研發
對於開發來說,我們在工作中或多或少都會遇到 web 效能優化 高併發等問題,而 nginx 是乙個萬能藥,它具備高效能 高擴充套件性 高可靠性 低記憶體消耗等優勢,不管是個人建立 部落格,還是進行網際網路應用開發,都可以輕鬆應對。實驗樓上線了一門 nginx 網路模組編寫入門 課程,或許可以幫助到有...
vue 從入門到精通 二
vue提供了大量的指令,比如 v if,v bind,v on 太多,多寫專案,多看api,這裡就不多說。1 vue 的三種模組 html模板 就是基於dom的一些有效的html標籤,如 字串模板 如下,先定義字串模板,然後在vue 的選項物件裡面利用template繫結。字串模板的優先順序會比ht...