chenshuo / muduo

Event-driven network library for multi-threaded Linux server in C++11
https://github.com/chenshuo/muduo
Other
14.71k stars 5.15k forks source link

需要调用wakeup函数吗? #513

Closed lys861205 closed 2 years ago

lys861205 commented 3 years ago

对于新连接TcpConnectPtr往epoll中添加需要关注的事件时需要wakeup唤醒当前EventLoop线程吗,直接调用epoll_ctl添加应该就可以吧

lys861205 commented 3 years ago

类似这样 ` //thread 1 int epoll_fd = epoll_create(256); int n = 256; struct epoll_event events[n]; while (1) { int nevents = epoll_wait(epoll_fd, events, n, -1); . . . }

// thread 2 int listen_fd = socket(...); bind(listen_fd, ...) listen(listen_fd, ...); struct epoll_event ev; ev.data.fd = listen_fd; ev.events = EPOLLIN; epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev); `

chenshuo commented 3 years ago

按照 muduo 的设计,epoll_wait() 和操作 listen_fd 会在同一个线程,不会出现跨线程添加事件的情况。

lys861205 commented 3 years ago

muduo设计的时候,不进行跨线程添加事情是什么考虑吗?

个人理解: 新连接到来,跨线程添加事件是不是可以省掉wakeup唤醒线程epoll_wait这步操作了

chenshuo commented 3 years ago

muduo 的设计是一个 socket 只属于一个 event loop,这个 socket 上的所有 IO 操作(包括回调用户 handler 和调用 epoll_ctl)都只会在其所属的 event loop 内发生,这样编程模型比较简单易懂。 所以一个 listening socket 的“新连接到来”这个事件只会发生在这个 listening socket 所属的 event loop,没有跨线程的情况。 对于 accept(listen_fd) 得到的新的连接,可以发派到别的 event loop,这一步是需要 wakeup 的,因为只有这样才能在另一个 event loop 执行 connection callback。