Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> asio::io_service::run busy-wait 
V
    Опции темы
GoldFinch
Дата 6.10.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



если вызвать io_service.run() не передав до этого ему обработчиков - он сразу же вернет управление
если вызывать io_service.run() в цикле - получится busy-wait (пустой цикл в потоке, 100% загрузка проца)

как сделать так, чтобы io_service.run() ждал обработчиков?
PM MAIL ICQ   Вверх
Lazin
Дата 6.10.2009, 21:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



нужно создать объект класса boost::asio::io_service::work и передать в конструктор ссылку на io_service
пока этот объект существует, run не будет возвращать управление
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 6.10.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, спасибо.
PM MAIL ICQ   Вверх
boostcoder
Дата 15.11.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Lazin @ 6.10.2009,  21:53)
нужно создать объект класса boost::asio::io_service::work и передать в конструктор ссылку на io_service
пока этот объект существует, run не будет возвращать управление

стоит заметить следующее:
т.к. некоторые хендлеры могут бросать исключения, происходит выход из run(). в документации по этому поводу предложено следующее решение:
Код

boost::asio::io_service io_service;
...
for (;;)
{
  try
  {
    io_service.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}

но тут не оговорено поведение io_service по отношению к io_service::work при появлении исключения.
а происходит следующее: когда мы получаем исключение из хендлера, io_service "отцепляется" от io_service::work. и если при повторном вызове run(), в этот момент в очереди нет хендлеров, то поток прекратит выполняться и вернет управление. что есть не совсем то что нам нужно.
как io_service обратно "прицепить" к io_service::work я так и не понял.

решается следующим способом:
Код

boost::asio::io_service io_service;
volatile bool _run = true;
...
while ( _run )
{
  try
  {
    io_service.run();
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
  boost::this_thread::sleep(boost::posix_time::milliseconds(10));
}

немного через попу...но ничего лучше не придумал smile 

Это сообщение отредактировал(а) boostcoder - 19.11.2010, 02:05
PM WWW   Вверх
boostcoder
Дата 15.11.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в этом случае io_service::work вообще не нужен.
PM WWW   Вверх
GoldFinch
Дата 19.11.2010, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(boostcoder @  15.11.2010,  20:55 Найти цитируемый пост)
boost::this_thread::sleep(boost::posix_time::milliseconds(10));

почему 10 ?
это тот же бизи-вейт, но еще и с дополнительной задержкой на 10мс =\
PM MAIL ICQ   Вверх
boostcoder
Дата 19.11.2010, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(GoldFinch @  19.11.2010,  01:41 Найти цитируемый пост)
это тот же бизи-вейт, но еще и с дополнительной задержкой на 10мс =\ 

задержка в 10мс при возникновении исключительной ситуации - это последнее о чем стОит беспокоится smile 
зато, если очередь пуста, проц не грузится впустую.
PM WWW   Вверх
bsa
Дата 19.11.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



boostcoder, а кто мешает io_service::work воткнуть внутрь try{}catch перед run?
PM   Вверх
boostcoder
Дата 19.11.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  19.11.2010,  18:01 Найти цитируемый пост)
а кто мешает io_service::work воткнуть внутрь try{}catch перед run? 

хм... сначала эта идея показалась мне гениальной. но проверив, обнаружил что при повторном входе в try блок, io_service не блокируется как ожидалось. может что-то в моем коде не так.. разбираюсь..
Код

   void run_io_service() {
      while ( true ) {
         try {
            boost::asio::io_service::work work(_io_service);
            _io_service.run();
         } catch (const boost::exception& e) {
            std::cout << "protocol_base::run_io_service:(boost::exception): " << boost::diagnostic_information(e) << std::endl;
         }
      }
      std::cout << "destruct thread <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
   }



Это сообщение отредактировал(а) boostcoder - 19.11.2010, 18:37
PM WWW   Вверх
bsa
Дата 19.11.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



если что-то не так, то это очень похоже на баг asio.
PM   Вверх
boostcoder
Дата 19.11.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



нет. никак не цепляется.
напишу в поддержку. любопытно.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1083 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.