Повысьте Asio в Linux, не используя Epoll - PullRequest
5 голосов
/ 24 июня 2010

У меня сложилось впечатление, что boost :: asio будет использовать установку epoll по умолчанию вместо реализации select, но после запуска некоторых тестов похоже, что моя установка использует select.

ОС: RHEL 4
Ядро: 2,6
GCC: 3.4.6

Я написал небольшую тестовую программу, чтобы проверить, какой коллектор реактора использовался, и похоже, что он использует выбранный реактор, а не реактор Эполла.

#include <boost/asio.hpp>

#include <string>
#include <iostream>

std::string output;

#if defined(BOOST_ASIO_EPOLL_REACTOR_HPP)

int main(void)
{
    std::cout << "you have epoll enabled." << std::endl;
}

#elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP)

int main(void)
{
    std::cout << "you have select enabled." << std::endl;
}

#else

int main(void)
{
    std::cout << "this shit is confusing." << std::endl;
}


#endif

Что я могу делать не так?

1 Ответ

4 голосов
/ 24 июня 2010

Ваша программа также говорит "выберите" для меня, но asio использует epoll_wait (), как сообщает ps -Teo tid,wchan:25,comm.

Как насчет

#include <iostream>
#include <string>
#include <boost/asio.hpp>
int main()
{
std::string output;
#if defined(BOOST_ASIO_HAS_IOCP)
  output = "iocp" ;
#elif defined(BOOST_ASIO_HAS_EPOLL)
  output = "epoll" ;
#elif defined(BOOST_ASIO_HAS_KQUEUE)
  output = "kqueue" ;
#elif defined(BOOST_ASIO_HAS_DEV_POLL)
  output = "/dev/poll" ;
#else
  output = "select" ;
#endif
    std::cout << output << std::endl;
}

(лестница захвата ifdefs)от /usr/include/boost/asio/serial_port_service.hpp)

...