ZMQ從入門到掌握二

2021-09-29 21:05:05 字數 3491 閱讀 3482

原始碼走讀

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...