#include <boost/fiber/all.hpp>
namespace boost {
namespace fibers {
class fiber;
bool operator<( fiber const& l, fiber const& r) noexcept;
void swap( fiber & l, fiber & r) noexcept;
template< typename SchedAlgo, typename ... Args >
void use_scheduling_algorithm( Args && ... args);
bool has_ready_fibers();
namespace algo {
struct algorithm;
template< typename PROPS >
struct algorithm_with_properties;
class round_robin;
class shared_round_robin;
}
namespace this_fiber {
fibers::id get_id() noexcept;
void yield();
template< typename Clock, typename Duration >
void sleep_until( std::chrono::time_point< Clock, Duration > const& abs_time)
template< typename Rep, typename Period >
void sleep_for( std::chrono::duration< Rep, Period > const& rel_time);
template< typename PROPS >
PROPS & properties();
}}
Каждый<fiber
>представляет собой микропоток, который будет запущен и управляться совместно планировщиком. Объекты типа<fiber
>являются только движущимися.
boost::fibers::fiber f1;
void f() {
boost::fibers::fiber f2( some_fn);
f1 = std::move( f2);
}
Новое волокно запускается путем пропускания объекта вызывающего типа, который может быть вызван без параметров. Если объект не должен быть скопирован или перемещен, тоstd::refможет использоваться для передачи в ссылке на объект функции. В этом случае пользователь должен убедиться, что упомянутый объект переживет вновь созданное волокно.
struct callable {
void operator()();
};
boost::fibers::fiber copies_are_safe() {
callable x;
return boost::fibers::fiber( x);
}
boost::fibers::fiber oops() {
callable x;
return boost::fibers::fiber( std::ref( x) );
}
При этом<fiber
>не запускается. Он стоит в очереди в списке готовых к работе волокон и будет работать, когда планировщик приблизится к нему.
Исключение, выходящее из функции или вызывающего объект, передается конструктору<fiber
><std::terminate()
>. Если вам нужно знать, какое исключение было брошено, используйте<future<>
>или<packaged_task<>
>.
<fiber
>может быть отделен путем явного вызова.<fiber::detach()
>Функция члена. После того, как<fiber::detach()
>вызван на объект волокна, этот объект представляетне-волокно. Затем объект волокна может быть безопасно уничтожен.
boost::fibers::fiber( some_fn).detach();
Boost.Fiberпредоставляет ряд способов ожидания завершения работающего волокна. Вы можете координировать даже с отсоединенным волокном, используя<mutex
>, или<condition_variable
>, или любой другойобъект синхронизации, предоставленный библиотекой.
Если отсоединенное волокно все еще работает, когда основное волокно нити & # 8217 заканчивается, нить не отключается.
Для того чтобы дождаться окончания волокна, можно использовать<fiber::join()
>элементную функцию<fiber
>объекта.<fiber::join()
>будет блокироваться до тех пор, пока<fiber
>объект не завершится.
void some_fn() {
...
}
boost::fibers::fiber f( some_fn);
...
f.join();
Если волокно уже завершено, то<fiber::join()
>немедленно возвращается и соединенный<fiber
>объект становитсяне-волокном.
Когда объект<fiber
>, представляющий действительный контекст исполнения (волокно<fiber::joinable()
>), разрушается, программа прекращается. Если вы хотите, чтобы волокно пережило объект<fiber
>, который его запустил, используйте метод<fiber::detach()
>.
{
boost::fibers::fiber f( some_fn);
}
{
boost::fibers::fiber f(some_fn);
f.detach();
}
Объекты класса<fiber::id
>могут использоваться для идентификации волокон. Каждый запущенный<fiber
>имеет уникальную<fiber::id
>, доступную из соответствующего<fiber
>, вызывая функцию<fiber::get_id()
>члена. Объекты класса<fiber::id
>могут копироваться и использоваться в качестве ключей в ассоциативных контейнерах: предоставляется полный спектр операторов сравнения. Они также могут быть записаны в выходной поток с помощью оператора вставки потока, хотя выходной формат не указан.
Каждый экземпляр<fiber::id
>либо относится к некоторому волокну, либоне-волокно. Случаи, которые относятся кне-волокну, сравниваются равными друг другу, но не равными любым экземплярам, которые относятся к фактическому волокну. Операторы сравнения на<fiber::id
>дают общий порядок для каждого неравенства<fiber::id
>.
<launch
>уточняет, переходит ли контроль непосредственно в вновь запущенное волокно.
enum class launch {
dispatch,
post
};
- Effects:
Вводимое с<launch
==dispatch
>волокно вводится немедленно. Другими словами, запуск волокна с<dispatch
>приостанавливает абонента (ранее работающее волокно) до тех пор, пока планировщик волокна не получит возможность возобновить его позже.
- Effects:
Волокно, запущенное с помощью<launch
==post
>, передается планировщику волокон как готовое, но оно еще не введено. Абонент (ранее работающий волокно) продолжает выполнять. Вновь запущенное волокно будет введено, когда планировщик волокна имеет возможность возобновить его позже.
- Note:
Если<launch
>не указано явно,<post
>является по умолчанию.