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

Fiber management

Boost , Chapter 1. Fiber , Chapter 1. Fiber

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

Synopsis

#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();
}}

Tutorial

Каждый<fiber>представляет собой микропоток, который будет запущен и управляться совместно планировщиком. Объекты типа<fiber>являются только движущимися.

boost::fibers::fiber f1; // not-a-fiber
void f() {
    boost::fibers::fiber f2( some_fn);
    f1 = std::move( f2); // f2 moved to f1
}

Launching

Новое волокно запускается путем пропускания объекта вызывающего типа, который может быть вызван без параметров. Если объект не должен быть скопирован или перемещен, тоstd::refможет использоваться для передачи в ссылке на объект функции. В этом случае пользователь должен убедиться, что упомянутый объект переживет вновь созданное волокно.

struct callable {
    void operator()();
};
boost::fibers::fiber copies_are_safe() {
    callable x;
    return boost::fibers::fiber( x);
} // x is destroyed, but the newly-created fiber has a copy, so this is OK
boost::fibers::fiber oops() {
    callable x;
    return boost::fibers::fiber( std::ref( x) );
} // x is destroyed, but the newly-created fiber still has a reference
  // this leads to undefined behaviour

При этом<fiber>не запускается. Он стоит в очереди в списке готовых к работе волокон и будет работать, когда планировщик приблизится к нему.

Exceptions

Исключение, выходящее из функции или вызывающего объект, передается конструктору<fiber><std::terminate()>. Если вам нужно знать, какое исключение было брошено, используйте<future<>>или<packaged_task<>>.

Detaching

<fiber>может быть отделен путем явного вызова.<fiber::detach()>Функция члена. После того, как<fiber::detach()>вызван на объект волокна, этот объект представляетне-волокно. Затем объект волокна может быть безопасно уничтожен.

boost::fibers::fiber( some_fn).detach();

Boost.Fiberпредоставляет ряд способов ожидания завершения работающего волокна. Вы можете координировать даже с отсоединенным волокном, используя<mutex>, или<condition_variable>, или любой другойобъект синхронизации, предоставленный библиотекой.

Если отсоединенное волокно все еще работает, когда основное волокно нити & # 8217 заканчивается, нить не отключается.

Joining

Для того чтобы дождаться окончания волокна, можно использовать<fiber::join()>элементную функцию<fiber>объекта.<fiber::join()>будет блокироваться до тех пор, пока<fiber>объект не завершится.

void some_fn() {
    ...
}
boost::fibers::fiber f( some_fn);
...
f.join();

Если волокно уже завершено, то<fiber::join()>немедленно возвращается и соединенный<fiber>объект становитсяне-волокном.

Destruction

Когда объект<fiber>, представляющий действительный контекст исполнения (волокно<fiber::joinable()>), разрушается, программа прекращается. Если вы хотите, чтобы волокно пережило объект<fiber>, который его запустил, используйте метод<fiber::detach()>.

{
    boost::fibers::fiber f( some_fn);
} // std::terminate() will be called
{
    boost::fibers::fiber f(some_fn);
    f.detach();
} // okay, program continues

Fiber IDs

Объекты класса<fiber::id>могут использоваться для идентификации волокон. Каждый запущенный<fiber>имеет уникальную<fiber::id>, доступную из соответствующего<fiber>, вызывая функцию<fiber::get_id()>члена. Объекты класса<fiber::id>могут копироваться и использоваться в качестве ключей в ассоциативных контейнерах: предоставляется полный спектр операторов сравнения. Они также могут быть записаны в выходной поток с помощью оператора вставки потока, хотя выходной формат не указан.

Каждый экземпляр<fiber::id>либо относится к некоторому волокну, либоне-волокно. Случаи, которые относятся кне-волокну, сравниваются равными друг другу, но не равными любым экземплярам, которые относятся к фактическому волокну. Операторы сравнения на<fiber::id>дают общий порядок для каждого неравенства<fiber::id>.

Enumeration launch

<launch>уточняет, переходит ли контроль непосредственно в вновь запущенное волокно.

enum class launch {
    dispatch,
    post
};

dispatch

Effects:

Вводимое с<launch ==dispatch>волокно вводится немедленно. Другими словами, запуск волокна с<dispatch>приостанавливает абонента (ранее работающее волокно) до тех пор, пока планировщик волокна не получит возможность возобновить его позже.

post

Effects:

Волокно, запущенное с помощью<launch ==post>, передается планировщику волокон как готовое, но оно еще не введено. Абонент (ранее работающий волокно) продолжает выполнять. Вновь запущенное волокно будет введено, когда планировщик волокна имеет возможность возобновить его позже.

Note:

Если<launch>не указано явно,<post>является по умолчанию.


PrevUpHomeNext

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




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



:: Главная :: Chapter 1. Fiber ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:30:18/0.0083699226379395/0