Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

when_all, simple completion

Boost , Chapter 1. Fiber , when_all functionality

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Для случая, в котором мы должны ждатьвсефункции задачи для завершения — но нам не нужны результаты (или ожидаем исключения) от любого из них — мы можем написать<wait_all_simple()>, который выглядит удивительно как<wait_first_simple()>. Разница в том, что вместо нашего<Done>класс, мы создаем<barrier>и назвать его<barrier::wait()>.

Мы начинаем<barrier>с<(count+1)>, потому что мы запускаем<count>волокна, плюс<wait()>вызов внутри<wait_all_simple()>.

template< typename ... Fns >
void wait_all_simple( Fns && ... functions) {
    std::size_t count( sizeof ... ( functions) );
    // Initialize a barrier(count+1) because we'll immediately wait on it. We
    // don't want to wake up until 'count' more fibers wait on it. Even though
    // we'll stick around until the last of them completes, use shared_ptr
    // anyway because it's easier to be confident about lifespan issues.
    auto barrier( std::make_shared< boost::fibers::barrier >( count + 1) );
    wait_all_simple_impl( barrier, std::forward< Fns >( functions) ... );
    barrier->wait();
}

Как было сказано выше, единственное различие между<wait_all_simple_impl()<wait_first_simple_impl()>заключается в том, что первые призывают<barrier::wait()>, а не<Done::notify()>:

template< typename Fn, typename ... Fns >
void wait_all_simple_impl( std::shared_ptr< boost::fibers::barrier > barrier,
                           Fn && function, Fns && ... functions) {
    boost::fibers::fiber(
            std::bind(
                []( std::shared_ptr< boost::fibers::barrier > & barrier,
                    typename std::decay< Fn >::type & function) mutable {
                        function();
                        barrier->wait();
                },
                barrier,
                std::forward< Fn >( function)
            )).detach();
    wait_all_simple_impl( barrier, std::forward< Fns >( functions) ... );
}

Вы можете назвать это так:

wait_all_simple(
        [](){ sleeper("was_long",   150); },
        [](){ sleeper("was_medium", 100); },
        [](){ sleeper("was_short",   50); });

Контроль не вернется с вызова<wait_all_simple()>до тех пор, пока не завершится последняя из его рабочих функций.


PrevUpHomeNext

Статья when_all, simple completion раздела Chapter 1. Fiber when_all functionality может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: when_all functionality ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:34:06/0.0035679340362549/0