2015-11-19 3 views
1

http://theboostcpplibraries.com/boost.asio-scalabilityC++ увеличить ASIO многопоточного

Я изучаю Boost.Asio и это вызывает у меня любопытство. Существует источник (пример 32.3)

#include <boost/asio/io_service.hpp> 
#include <boost/asio/steady_timer.hpp> 
#include <chrono> 
#include <thread> 
#include <iostream> 

using namespace boost::asio; 

int main() 
{ 
    io_service ioservice; 

    steady_timer timer1{ioservice, std::chrono::seconds{3}}; 
    timer1.async_wait([](const boost::system::error_code &ec) 
    { std::cout << "3 sec\n"; }); 

    steady_timer timer2{ioservice, std::chrono::seconds{3}}; 
    timer2.async_wait([](const boost::system::error_code &ec) 
    { std::cout << "3 sec\n"; }); 

    std::thread thread1{[&ioservice](){ ioservice.run(); }}; 
//std::thread thread2{[&ioservice](){ ioservice.run(); }}; 
    thread1.join(); 
//thread2.join(); 
} 

Хотя я опускаю thread2, выход экрана равен. Число потоков в исходном примере равно двум, а количество потоков в этом источнике - одно. Хотя число потоков равно одному, таймер 1 и таймер2 начинают и заканчивают одновременно.

Интересно, почему число потоков должно быть два.
Спасибо за ваше отношение!

ответ

4

Пункт примера состоит в том, что у вас может быть много потоков, вызывающих ioservice.run(), чтобы получить более масштабируемый код. В двух версиях потока возможно, что обработчики timer1 и timer2 обрабатываются в разных потоках, и поэтому вы можете добиться параллелизма для повышения производительности.

В этом примере не показано, что, как вы продемонстрировали. Чтобы увидеть реальную разницу, попробуйте сделать это как обработчик для обоих таймеров и сравните одну и две версии резьбы:

timer1.async_wait([](const boost::system_error::error_code& ec) { 
    std::cout << "3 sec, pausing\n"; 
    sleep(4); 
    std::cout << "Finished pausing\n"; 
}); 
+0

пока это/работает/это действительно плохой пример для асинхронного программирования; Обработчики Async не должны выполнять задачи блокировки. В противном случае вы можете легко голодать от задач ввода-вывода. Используйте очередь и выделенные рабочие для работы с более длинными работающими задачами. Кроме этого, объяснение на месте, поэтому +1 – sehe

+0

@sehe Я согласен - цель этого примера - продемонстрировать одновременное или последовательное выполнение обработчика, показывая вход и выход обработчика в человеческом масштабе. – janm

+0

Благодарим вас за помощь. –

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