说一下 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
{
.......
cpipe_t _cpipe;
signaler_t _signaler;
.......
}
signaler_t 在linux下 使用socketpair 实现的 win下用 CreateEventW 实现的
int rc = socketpair (AF_UNIX, type, 0, sv);
if (rc == -1) {
errno_assert (errno == ENFILE || errno == EMFILE);
*w_ = *r_ = -1;
return -1;
} else {
make_socket_noninheritable (sv[0]);
make_socket_noninheritable (sv[1]);
*w_ = sv[0];
*r_ = sv[1];
return 0;
}
发送信号时
void zmq::signale