- zmq::reaper_t::reaper_t (class ctx_t *ctx_, uint32_t tid_) :
-
object_t (ctx_, tid_),
-
sockets (0),
-
terminating (false)
-
{
- /* Linux下,poller_t实际上即为epoll_t*/
-
poller = new (std::nothrow) poller_t;
-
alloc_assert (poller);
/*
这里的mailbox.get_fd()得到该reaper_t拥有的mailbox的读描述符。
这里就体现了C++中一项让人不爽的地方——这个描述符是何时赋值的呢?
首先目前在reaper_t的构造函数中,那么其成员变量mailbox已经执行了默认构造函数,然后mailbox的成员变量
signaler也执行了默认构造函数,然后在这个构造函数中通过socketpair,得到了两个UNIX域socket pair。
其中r为读取的socket。
这里我发表一下自己的看法吧:
1. 构造函数了作了这么多事,那么构造函数调用的函数失败了怎么办?这时可以说构造函数“失败了”,关于这一 点Scott作了非常好的论述,我就不重复了。在zeromq中,我看到zeromq是不允许任何这样的失败发生,一旦真
的失败,那么就直接abort了。程序直接挂掉,这种做法对于关键的进程,不一定合适。
2. 由于很多操作都是在构造函数中做的。也就说明这些调用操作,都是隐式发生的。那么对于代码的阅读者来说,
阅读代码还是有一些麻烦的。
也许这个不爽,是因为我很久没有碰C++的代码了吧。
*/
-
mailbox_handle = poller->add_fd (mailbox.get_fd (), this);
- 。。。。。。
-
}