2016-12-07 3 views
3

У меня есть tcp-сервер, который использует libev как цикл события; для новых обслуживаемых сокетов я установил:100% загрузка процессора с libev

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

, когда новое соединение пришедшее, мой сервер потребляет весь циклы процессора, у меня есть 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 
          .... 

есть решение Ф.О. эта проблема, пожалуйста?

ответ

4

Я нашел решение, для тех, кто заинтересован в этом вопросе:

при принятии нового сокета, не вызова ev_io_init с EV_WRITE, назову его только с 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 */ 
} 
+0

Спасибо. Это помогло мне. Я был за таймерами, вызывая высокий процессор. Но это решило мою проблему. Я установил EVEREAD и EV_WRITE для нового сокета. – sunil

+0

Hi; приветствую вас –

Смежные вопросы