Zeromq 學習筆記2 郵件槽 執行緒間通訊

2021-09-27 10:43:05 字數 1886 閱讀 6241

說一下 zmq 的通訊機制 mailbox 主要用於 io執行緒之間 io執行緒和 socket 之間的通訊 。

mailbox 主要有兩個實現 乙個是 mailbox_t 另乙個是 mailbox_safe_t

區別 mailbox_t 是一對一通訊多個生產者對乙個消費者  mailbox_safe_t 多個生產者對多個消費者

mailbox_t 中有兩個核心的屬性 _cpipe _signaler

_cpipe 訊息佇列 未實現執行緒安全

_signaler 訊號 負責阻塞和通知

class mailbox_t : public i_mailbox

signaler_t  在linux下 使用socketpair 實現的 win下用 createeventw 實現的

int rc = socketpair (af_unix, type, 0, sv);

if (rc == -1) else

傳送訊號時

void zmq::signaler_t::send ()

#endif

zmq_assert (nbytes == sizeof dummy);

break;

}}

阻塞時

struct pollfd pfd;

pfd.fd = _r;

pfd.events = pollin;

const int rc = poll (&pfd, 1, timeout_);

if (unlikely (rc < 0))

if (unlikely (rc == 0))

在看 mail 是怎麼傳送指令的

void zmq::mailbox_t::send (const command_t &cmd_)

接受指令

int zmq::mailbox_t::recv (command_t *cmd_, int timeout_)

// wait for signal from the command sender.

int rc = _signaler.wait (timeout_);

if (rc == -1)

// receive the signal.

rc = _signaler.recv_failable ();

if (rc == -1)

// switch into active state.

_active = true;

// get a command.

const bool ok = _cpipe.read (cmd_);

zmq_assert (ok);

return 0;

}

從**中可以看出由於比較適合多寫一讀,而mailbox_safe_t 發訊息時會廣播給所以的消費者

void zmq::mailbox_safe_t::send (const command_t &cmd_)

}_sync->unlock ();

}

接收訊息時 

int zmq::mailbox_safe_t::recv (command_t *cmd_, int timeout_)

// another thread may already fetch the command

const bool ok = _cpipe.read (cmd_);

if (!ok)

return 0;

}

比較適合多生產者多消費者

QT學習筆記(2) 訊號與槽

1 moc 元物件 系統簡介 在 qt 助手的索引裡面輸入 the meta object system 就可以看到元物件系統的英文文件。現在將其主要的內容描述如下 qt 元物件系統實現了物件之間通訊機制 訊號和槽,並提供了執行時型別資訊和動態屬性系統。元物件系統是 qt 類庫獨有的功能,是 qt ...

線代筆記2

可逆 行列式不為零 滿秩 齊次方程只有零解 線性無關 線性無關的意思是 向量之間沒有任何關係,誰也不能表示誰,誰也不能被誰表示,向量前的係數都是零 在高斯消元過程中,會出現方程組中若干個方程被消去的情況,剩下的方程個數稱為r,稱為線性方程組的秩。這r個方程可以表示原方程組中的所有方程,並且這r個方程...

Qt學習筆記 訊號與槽

訊號和槽用於兩個物件之間的通訊,是qt的核心特徵和突出特徵。當乙個特殊的事件發生時,相關物件便會發出乙個訊號,比如單擊滑鼠 按鍵等。槽就是乙個函式,用來響應訊號,可以自定義或者使用已存在的函式。訊號和槽的對應關係 乙個訊號何以關聯到多個槽,乙個槽也可以關聯多個訊號,甚至乙個訊號也可以關聯到另乙個訊號...