gpt4 book ai didi

c - libev CPU 使用率 100%

转载 作者:行者123 更新时间:2023-12-05 01:26:40 25 4
gpt4 key购买 nike

我有一个使用 libev 作为事件循环的 tcp 服务器;对于新接受的套接字我设置:

 ev_io_init(&conn->io, tcp_conn_on_event_cb, conn->fd, EV_READ | EV_WRITE);

当新连接到来时,我的服务器消耗了整个 CPU 周期,我的 CPU 使用率为 100%。我的程序一直调用回调 tcp_conn_on_event_cb 并将 revents 设置为 EV_WRITE

static void tcp_conn_on_event_cb(ev_loop_t *loop, ev_io *ev, int revents)

当我做

strace mybinary

我有这个:

epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
epoll_wait(4, {{EPOLLOUT, {u32=7, u64=4294967303}}}, 64, 59743) = 1
....

请问这个问题有解决办法吗?

最佳答案

我找到了一个解决方案,对于那些对这个问题感兴趣的人:

接受一个新套接字时,不要用EV_WRITE调用ev_io_init,只能用EV_READ调用。

ev_io_init(&conn->io, tcp_conn_on_event_cb, conn->fd, EV_READ);

在回调中,如果你有数据要写入(到套接字),你可以使用ev_feed_fd_event

static void tcp_conn_on_event_cb(ev_loop_t *loop, ev_io *ev, int revents)
{
....

if (revents | EV_WRITE) {
/* write your data here */
}

if (data_is_ready()) {
ev_feed_fd_event(loop, conn->fd, EV_WRITE | revents);
return;
}

/* do other job */
}

关于c - libev CPU 使用率 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com