LINUX.ORG.RU

boost::asio можно ли заставить boost::asio использовать boost::thread, а не std::thread ?

 , ,


0

4

Добрый день.
Использую boost::asio 1.62.0
Можно ли заставить boost::asio использовать boost::thread, вместо std::thread?
Смысл в том, что иногда использую boost::thread, так вот зачем одновременно тянуть std::thread и boost::thread, если можно обойтись одним.

★★★★★

Подозреваю, что там есть какой-то дефайн, который можно задать на стадии сборки буста.

DELIRIUM ☆☆☆☆☆ ()

в С++ шило на мыло завсегда можно поменять

slackwarrior ★★★★★ ()

тянуть std::thread и boost::thread, если можно обойтись одним.

Ты делаешь какую-то херню. asio сам ничего не использует. Только то, что ему скормишь.

И boost::thread разве не тайпдеф для std::thread, когда он найден?

anonymous ()
Ответ на: комментарий от anonymous

И boost::thread разве не тайпдеф для std::thread, когда он найден?

а должен? что то не помню как минимум interuption_points в стандарте (туда и rw лок то поначалу забыли добавить...)

Ты делаешь какую-то херню. asio сам ничего не использует. Только то, что ему скормишь.

я вот тоже попытался сообразить где asio потоки создаёт и не припомнил

pon4ik ★★★★★ ()

DELIRIUM, slackwarrior, pon4ik, btolfa.
Прошу прощения, что тему забросил.
boost::asio использует std::thread например в deadline_timer.
Пока я пришел к выводу, что в последних версиях boost::asio использует std::thread и это не настраиваемо.
Для проверки можно банально выполнить поиск строк, содержащих <thread> в заголовочных файлах boost::asio.

http://think-async.com asio без boost становится header only

Я не проверял, но думаю там тоже используется std::thread.

rumgot ★★★★★ ()
Ответ на: комментарий от rumgot

boost::asio использует std::thread например в deadline_timer.

Шта? номер строки и файл в студию.

boost::asio для сборки только libboost_system требует, из котрого оно ошибки берет. Никакой thread ему не нужен. ему нужен io_service.

anonymous ()
Ответ на: комментарий от rumgot

Ааа я понял. Это под винды оно так работает. Там была как-то хрень с тем что для поддержки всякой хп они там отдельный поток пускают для таймера. Это вроде отключить можно.

anonymous ()
Ответ на: комментарий от rumgot

Ага, похоже. Хотя про deadline_timer - это только под онтопик, под оффтопиком iocp умеет в таймеры.

А чем тебя не устраивает std::thread, когда доступен, конкретно в таймере? По сути это всё равно будет ~zerocost интерфейс к pthreads или glibc? Это тонкости реализации, непонятно как ты вообще можешь наблюдать сиё не под отладчиком дебажной сборки буста.

pon4ik ★★★★★ ()
Ответ на: комментарий от anonymous

Нет, это как раз под онтопиком нужен поток, а под вендой есть поддержка на уровне winapi асинхронных таймеров.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Херь

int main( int argc, char *argv[] )
{

    boost::asio::io_service ios;
    boost::asio::deadline_timer bat(ios);

    bat.expires_from_now( boost::posix_time::seconds(100) );
    bat.async_wait( [](...){ std::cout << "!\n"; } );

    ios.run( );

    return 0;
}

Вижу только 1 поток. Слинковано только с boost_system для get_system_category

А вот под оффтопиком таки потока 2

anonymous ()
Ответ на: комментарий от pon4ik

Честно говоря, тут особой практической ценности нет в данной затее. Просто разбираюсь с тонкостями boost::asio.

rumgot ★★★★★ ()
Ответ на: комментарий от anonymous

А ну логично, оно просто цикл просыпает для таймера. Зачем тогда под онтопиком поток, и зачем тогда вообще поток...

Для «поддержки всякой xp» понял.

pon4ik ★★★★★ ()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от pon4ik
int epoll_reactor::do_timerfd_create()
{
#if defined(BOOST_ASIO_HAS_TIMERFD)
# if defined(TFD_CLOEXEC)
  int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
# else // defined(TFD_CLOEXEC)
  int fd = -1;
  errno = EINVAL;
# endif // defined(TFD_CLOEXEC)

  if (fd == -1 && errno == EINVAL)
  {
    fd = timerfd_create(CLOCK_MONOTONIC, 0);
    if (fd != -1)
      ::fcntl(fd, F_SETFD, FD_CLOEXEC);
  }

  return fd;
#else // defined(BOOST_ASIO_HAS_TIMERFD)
  return -1;
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
}

anonymous ()
Ответ на: комментарий от anonymous

А, с epoll сделали как в iocp, прикольно и симпатишно. У меня видимо тухлая инфо осталась про системы без epoll.

Спасибо.

pon4ik ★★★★★ ()
Ответ на: комментарий от anonymous

К deadline_timer не относится, но тем не менее.
Еще вот такой код требует libpthread:

#include <iostream>
#include <functional>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class client
{
public:
    client(boost::asio::io_service& io_service)
        : resolver_(io_service),
          socket_(io_service)
    {
        tcp::resolver::query query("www.google.com", "http");
        resolver_.async_resolve(query,
                                std::bind(&client::handle_resolve, this,
                                          std::placeholders::_1,
                                          std::placeholders::_2));
    }

private:
    void handle_resolve(const boost::system::error_code& err,
                        tcp::resolver::iterator endpoint_iterator)
    {
        std::cout << "Handle resolve" << std::endl;
    }
    tcp::resolver resolver_;
    tcp::socket socket_;
};

int main(int argc, char* argv[])
{

    boost::asio::io_service io_service;
    client c(io_service);
    io_service.run();

    return 0;
}

rumgot ★★★★★ ()
Ответ на: комментарий от rumgot

Действительно ... И даже поток запустило. Видимо резолвер как-то так работает.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.