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

Channels

Boost , Chapter 1. Fiber , Synchronization

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

Boost.Fiber provides a bounded and a unbounded channel suitable to synchonize fibers via message passing.

typedef boost::fibers::unbounded_channel< int > channel_t;
void send( channel_t & channel) {
    for ( int i = 0; i < 5; ++i) {
        channel.push( i);
    }
    channel.close();
}
void recv( channel_t & channel) {
    int i;
    while ( boost::fibers::channel_op_status::success == channel.pop(i) ) {
        std::cout << "received " << i << std::endl;
    }
}
channel_t channel;
boost::fibers::fiber f1( std::bind( send, ref( channel) ) );
boost::fibers::fiber f2( std::bind( recv, ref( channel) ) );
f1.join();
f2.join();
Enumeration channel_op_status

операции канала возвращают состояние канала.

enum class channel_op_status {
    success,
    empty,
    full,
    closed,
    timeout
};
success

Effects:

Операция прошла успешно.

empty

Effects:

канал пуст, операция провалилась.

full

Effects:

канал полный, операция провалилась.

closed

Effects:

канал закрыт, операция провалилась.

timeout

Effects:

Операция не была готова до истечения установленного срока.

Template unbounded_channel<>

#include <boost/fiber/unbounded_channel.hpp>
namespace boost {
namespace fibers {
template< typename T, typename Allocator = std::allocator< T > >
class unbounded_channel {
public:
    typedef T   value_type;
    explicit unbounded_channel( Allocator const& alloc = Allocator() ) noexcept;
    unbounded_channel( unbounded_channel const& other) = delete;
    unbounded_channel & operator=( unbounded_channel const& other) = delete;
    void close() noexcept;
    channel_op_status push( value_type const& va);
    channel_op_status push( value_type && va);
    channel_op_status pop( value_type & va);
    value_type value_pop();
    channel_op_status try_pop( value_type & va);
    template< typename Rep, typename Period >
    channel_op_status pop_wait_for(
        value_type & va,
        std::chrono::duration< Rep, Period > const& timeout_duration);
    template< typename Clock, typename Duration >
    channel_op_status pop_wait_until(
        value_type & va,
        std::chrono::time_point< Clock, Duration > const& timeout_time);
};
}}
Constructor
explicit unbounded_channel( Allocator const& alloc = Allocator() ) noexcept;

Effects:

Конструирует объект класса unbounded_channel. Внутренние узлы выделяются с помощью alloc - C++11-алокаторы поддерживаются.

Throws:

Ничего.

See also:

Аллокат концепция, std::allocator< T >

Member function close()

void close() noexcept;

Effects:

Отключает канал. После вызова это->поп()(). Волокна, заблокированные в это-> value_pop(), получат исключение.

Throws:

Ничего.

Note:

Close() - это как закрытие трубы. Он информирует ожидающих потребителей, что больше никаких ценностей не будет.

Member function push()

channel_op_status push( value_type const& va);
channel_op_status push( value_type && va);

Effects:

Если канал закрыт, возвращается закрытое. В противном случае задает значение в канале, разбудит волокно, заблокированное на это->поп(), это->значение_поп(), это->>>>.

Throws:

Исключения, выброшенные распределением памяти и копированием или перемещением va.

Member function pop()

channel_op_status pop( value_type & va);

Effects:

Задает значение от канала. Если канал пуст, волокно приостанавливается до тех пор, пока, по крайней мере, один новый пункт не будет push()ed (возвратное значение success и va содержит вывешенное значение) или канал получает Close()d (возвратное значение ).

Throws:

Ничего

Member function value_pop()

value_type value_pop();

Effects:

Задает значение от канала. Если канал пуст, волокно приостанавливается до тех пор, пока по крайней мере один новый пункт не будет push()ed или канал не получит Close()d (который бросает исключение).

Throws:

fiber_error если *это закрыто

Error conditions:

std::errc::

Member function try_pop()

channel_op_status try_pop( value_type & va);

Effects:

Если канал пуст, возвращается пустая. Если канал закрыт, возвращается закрытое. В противном случае он возвращает success и va содержит заданные значения.

Throws:

Исключения, выброшенные копией или перемещениями.

Member function pop_wait_for()

template< typename Rep, typename Period >
channel_op_status pop_wait_for(
    value_type & va,
    std::chrono::duration< Rep, Period > const& timeout_duration)

Effects:

Принимает std::chrono::duration и внутренне вычисляет время ожидания как (системное время + timeout_duration). Если канал не пуст, сразу выдает значение из канала. В противном случае клетчатка приостанавливается до тех пор, пока по крайней мере один новый пункт не будет push()ed (возвратное значение success и va содержит вывешенное значение), или канал получает закрытие()d (закрытый значение ) или системное время достигает расчетного времени ожидания (возвратное значение >>.

Throws:

исключения, связанные с таймаутом.

Member function pop_wait_until()

template< typename Clock, typename Duration >
channel_op_status pop_wait_until(
    value_type & va,
    std::chrono::time_point< Clock, Duration > const& timeout_time)

Effects:

Принимает std::chrono::time_point<Clock, Duration >. Если канал не пуст, сразу выдает значение из канала. В противном случае клетчатка приостанавливается до тех пор, пока, по крайней мере, один новый пункт не будет push()success и va содержит вывешенное значение), или канал получает Close()d (исключенное значение ), или системное время достигает пройденного _timeout<221>.

Throws:

исключения, связанные с таймаутом.

Template bounded_channel<>

#include <boost/fiber/bounded_channel.hpp>
namespace boost {
namespace fibers {
template< typename T, typename Allocator = std::allocator< T > >
class bounded_channel {
public:
    typedef T   value_type;
    bounded_channel( std::size_t wm, Allocator const& alloc = Allocator() );
    bounded_channel( std::size_t hwm, std::size_t lwm, Allocator const& alloc = Allocator() );
    bounded_channel( bounded_channel const& other) = delete;
    bounded_channel & operator=( bounded_channel const& other) = delete;
    std::size_t upper_bound() const noexcept;
    std::size_t lower_bound() const noexcept;
    void close() noexcept;
    channel_op_status push( value_type const& va);
    channel_op_status push( value_type && va);
    template< typename Rep, typename Period >
    channel_op_status push_wait_for(value_type const& va,std::chrono::duration< Rep, Period > const& timeout_duration);
    channel_op_status push_wait_for( value_type && va,std::chrono::duration< Rep, Period > const& timeout_duration);
    template< typename Clock, typename Duration >
    channel_op_status push_wait_until(value_type const& va,std::chrono::time_point< Clock, Duration > const& timeout_time);
    template< typename Clock, typename Duration >
    channel_op_status push_wait_until(value_type && va,std::chrono::time_point< Clock, Duration > const& timeout_time);
    channel_op_status try_push( value_type const& va);
    channel_op_status try_push( value_type && va);
    channel_op_status pop( value_type & va);
    value_type value_pop();
    template< typename Rep, typename Period >
    channel_op_status pop_wait_for(value_type & va,std::chrono::duration< Rep, Period > const& timeout_duration);
    template< typename Clock, typename Duration >
    channel_op_status pop_wait_until(value_type & va,std::chrono::time_point< Clock, Duration > const& timeout_time);
    channel_op_status try_pop( value_type & va);
};
}}
Constructor
bounded_channel( std::size_t wm, Allocator const& alloc = Allocator() );
bounded_channel( std::size_t hwm, std::size_t lwm, Allocator const& alloc = Allocator() );

Preconditions:

hwm > lwm

Effects:

Конструирует объект класса bounded_channel. Конструктор с двумя аргументами строит объект класса bounded_channel с высоким водяным знаком hwm и низководный знак lwm. Конструктор с одним std::size_t аргумент фактически такой же, как bounded_channel(wm, (wm-1),alloc). Внутренние узлы выделяются с помощью alloc - C++11-алокаторы поддерживаются.

Throws:

fiber_error

Error Conditions:

invalid_argument: если lwm >= hwm.

Notes:

Как только количество значений в канале достигает hwm, любой вызов push(), push_wait_ для() или push_wait_until() будет блокироваться до тех пор, пока количество значений в канале не будет по максимуму lwm. То есть, если lwm < (hwm-1), канал может быть в состоянии, в котором push(), push_wait_for() или push_wait_untnel_until>>.

See also:

Аллокат концепция, std::allocator< T >

Member function upper_bound()

std::size_t upper_bound() const noexcept;

Returns:

*этот был построен.

Throws:

Ничего.

Member function lower_bound()

std::size_t lower_bound() const noexcept;

Returns:

*этот был построен.

Throws:

Ничего.

Member function close()

void close() noexcept;

Effects:

Отключает канал. После вызова это->поп()(). Волокна, заблокированные в это-> value_pop(), получат исключение.

Throws:

Ничего.

Note:

Close() - это как закрытие трубы. Он информирует ожидающих потребителей, что больше никаких ценностей не будет.

Member function push()

channel_op_status push( value_type const& va);
channel_op_status push( value_type && va);

Effects:

Если канал закрыт, возвращается закрытое. Если канал не полный, задает значение в канале, пробуждает волокно, заблокированное на этом->поп(), этом->значение_поп(), это->поп_ваит_ для() В противном случае клетчатое волокно приостанавливается до тех пор, пока число значений в канале не упадет до lwm (возвратное значение success) или канал close()d (возвратное значение закрытое).

Throws:

исключения, выброшенные путем распределения памяти и копирования или перемещения va.

Member function push_wait_for()

template< typename Rep, typename Period >
channel_op_status push_wait_for(
    value_type const& va,
    std::chrono::duration< Rep, Period > const& timeout_duration);
template< typename Rep, typename Period >
channel_op_status push_wait_for(
    value_type && va,
    std::chrono::duration< Rep, Period > const& timeout_duration);

Effects:

Принимает std::chrono::duration и внутренне вычисляет тайм-точку как (система времени + timeout_duration). Если канал закрыт, возвращается закрытое. Если канал не заполнен, задает значение в канале, пробуждает волокно, заблокированное на это->поп(), эт ->поп(), >>>>>>>>>>>>>> В противном случае клетчатое волокно приостанавливается до тех пор, пока число значений в канале не упадет до lwm (вновь значение success), канал close()d (вновь значение закрытое), или системное время достигает расчетной точки времени_положений (время возврата время ).

Throws:

исключения, выброшенные путем распределения памяти и копирования или перемещения va или исключений, связанных с тайм-аутом.

Member function push_wait_until()

template< typename Clock, typename Duration >
channel_op_status push_wait_until(
    value_type const& va,
    std::chrono::time_point< Clock, Duration > const& timeout_time);
template< typename Clock, typename Duration >
channel_op_status push_wait_until(
    value_type && va,
    std::chrono::time_point< Clock, Duration > const& timeout_time);

Effects:

Принимает абсолютную timeout_time в любом поддерживаемом типе Time_point. Если канал закрыт, возвращается закрытое. Если канал не заполнен, задает значение в канале, пробуждает волокно, заблокированное на это->поппоп(), это->поп>>>>>>>>>>>>>>>>>>>>>1>поп поп >>>>>>> В противном случае клетчатое волокно приостанавливается до тех пор, пока число значений в канале не упадет до lwm (возвратное значение success), канал Close()d (возвратное значение закрытое), или системное время достигает пройденной точки времени (возвратное значение Timeout).

Throws:

исключения, выброшенные путем распределения памяти и копирования или перемещения va или исключений, связанных с тайм-аутом.

Member function try_push()

channel_op_status try_push( value_type const& va);
channel_op_status try_push( value_type && va);

Effects:

Если канал заполнен, возвращается full. Если канал закрыт, возвращается закрытое. В противном случае задает значение в канале, разбудит волокно, заблокированное на это->поп(), это->=2> или поп>>>>>>>>>>.

Throws:

Исключения, выброшенные распределением памяти и копированием или перемещением va.

Member function pop()

channel_op_status pop( value_type & va);

Effects:

Задает значение от канала. Если канал пуст, волокно приостанавливается до тех пор, пока, по крайней мере, один новый пункт не будет push()ed (возвратное значение success и va содержит вывешенное значение) или канал получает Close()d (возвратное значение ). Как только количество предметов, оставшихся в канале, упадет до lwm, любые волокна заблокированы на push(), push_wait_ для() или push_wait_until() могут возобновиться.

Throws:

Ничего

Member function value_pop()

value_type value_pop();

Effects:

Задает значение от канала. Если канал пуст, то волокно приостанавливается до тех пор, пока по крайней мере один новый пункт не будет push() или канал не получит Close()d (который бросает исключение). Как только количество предметов, оставшихся в канале, упадет до lwm, любые волокна заблокированы на push(), push_wait_ для() или push_wait_until() могут возобновиться.

Throws:

fiber_error если *это закрыто

Error conditions:

std::errc::

Member function try_pop()

channel_op_status try_pop( value_type & va);

Effects:

Если канал пуст, возвращается пустая. Если канал закрыт, возвращается закрытое. В противном случае он возвращает success и va содержит заданные значения. Как только количество предметов, оставшихся в канале, упадет до lwm, любые волокна заблокированы на push(), push_wait_ для() или push_wait_until() могут возобновиться.

Throws:

Исключения, выброшенные копией или перемещениями.

Member function pop_wait_for()

template< typename Rep, typename Period >
channel_op_status pop_wait_for(
    value_type & va,
    std::chrono::duration< Rep, Period > const& timeout_duration)

Effects:

Принимает std::chrono::duration и внутренне вычисляет время ожидания как (системное время + timeout_duration). Если канал не пуст, сразу выдает значение из канала. В противном случае клетчатка приостанавливается до тех пор, пока по крайней мере один новый пункт не будет push()ed (возвратное значение success и va содержит вывешенное значение), или канал получает закрытие()d (закрытый значение ) или системное время достигает расчетного времени ожидания (возвратное значение >>. Как только количество предметов, оставшихся в канале, упадет до lwm, любые волокна заблокированы на push(), push_wait_ для() или push_wait_until() могут возобновиться.

Throws:

исключения, связанные с таймаутом.

Member function pop_wait_until()

template< typename Clock, typename Duration >
channel_op_status pop_wait_until(
    value_type & va,
    std::chrono::time_point< Clock, Duration > const& timeout_time)

Effects:

Принимает std::chrono::time_point<Clock, Duration >. Если канал не пуст, сразу выдает значение из канала. В противном случае клетчатка приостанавливается до тех пор, пока, по крайней мере, один новый пункт не будет push()success и va содержит вывешенное значение), или канал получает Close()d (исключенное значение ), или системное время достигает пройденного _timeout<221> Как только количество предметов, оставшихся в канале, упадет до lwm, любые волокна заблокированы на push(), push_wait_ для() или push_wait_until() могут возобновиться.

Throws:

исключения, связанные с таймаутом.


PrevUpHomeNext

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




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



:: Главная :: Synchronization ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 07:20:46/0.0076191425323486/0