Поделиться через


Класс concurrent_queue

Класс concurrent_queue представляет собой контейнер типа последовательности, который позволяет доступ к элементам по принципу «первым вошел — первым вышел». Он позволяет использовать ограниченный набор параллельно-безопасных операций, таких как push и try_pop. Здесь "безопасность для параллелизма" означает, что указатели или итераторы всегда допустимы. Это не гарантия инициализации элементов или определенного порядка обхода.

Синтаксис

template<typename T, class _Ax>
class concurrent_queue: public ::Concurrency::details::_Concurrent_queue_base_v4;

Параметры

T
Тип данных элементов, хранящихся в очереди.

_Ax
Тип, представляющий сохраненный объект распределителя, инкапсулирующий сведения о выделении и размещении памяти для этой параллельной очереди. Этот аргумент является необязательным, и значением по умолчанию является allocator<T>.

Участники

Общедоступные typedefы

Имя Описание
allocator_type Тип, представляющий класс распределителя для параллельной очереди.
const_iterator Тип, представляющий непотокобезопасный const итератор по элементам в параллельной очереди.
const_reference Тип, предоставляющий ссылку на const элемент, хранящийся в параллельной очереди для чтения и выполнения const операций.
difference_type Тип, предоставляющий подписанное расстояние между двумя элементами в параллельной очереди.
iterator Тип, представляющий непотокобезопасный итератор по элементам в параллельной очереди.
reference Тип, предоставляющий ссылку на элемент, хранящийся в параллельной очереди.
size_type Тип, который подсчитывает количество элементов в параллельной очереди.
value_type Тип, представляющий тип данных, хранящийся в параллельной очереди.

Открытые конструкторы

Имя Описание
concurrent_queue Перегружен. Создает параллельную очередь.
Деструктор ~concurrent_queue Уничтожает параллельную очередь.

Открытые методы

Имя Описание
очистить Очищает конкурентную очередь, уничтожая любые элементы, поставленные в очередь в настоящее время. Этот метод не является безопасным для параллелизма.
empty Проверяет, пуста ли конкурентная очередь в момент вызова этого метода. Этот метод является безопасным для параллелизма.
get_allocator Возвращает копию аллокатора, используемого для создания параллельной очереди. Этот метод является безопасным для параллелизма.
push Перегружен. Добавляет элемент в хвост параллельной очереди. Этот метод является безопасным для параллелизма.
try_pop Удаляет элемент из очереди, если он доступен. Этот метод является безопасным для параллелизма.
небезопасное_начало Перегружен. Возвращает итератор типа iterator или const_iterator в начало параллельной очереди. Этот метод не является безопасным для параллелизма.
unsafe_end Перегружен. Возвращает итератор типа iterator или const_iterator в конец параллельной очереди. Этот метод не является безопасным для параллелизма.
unsafe_size Возвращает количество элементов в очереди. Этот метод не является безопасным для параллелизма.

Замечания

Дополнительные сведения см. в разделе "Параллельные контейнеры и объекты".

Иерархия наследования

concurrent_queue

Требования

Заголовок: concurrent_queue.h

Пространство имен: конкурентность

очистить

Очищает конкурентную очередь, уничтожая любые элементы, поставленные в очередь в настоящее время. Этот метод не является безопасным для параллелизма.

void clear();

concurrent_queue

Создает параллельную очередь.

explicit concurrent_queue(
    const allocator_type& _Al = allocator_type());

concurrent_queue(
    const concurrent_queue& _OtherQ,
    const allocator_type& _Al = allocator_type());

concurrent_queue(
    concurrent_queue&& _OtherQ,
    const allocator_type& _Al = allocator_type());

template<typename _InputIterator>
concurrent_queue(_InputIterator _Begin,
    _InputIterator _End);

Параметры

_InputIterator
Тип входного итератора, задающего диапазон значений.

_Аль
Класс распределителя для использования с данным объектом.

_OtherQ
Исходный объект concurrent_queue для копирования или перемещения элементов.

_Начинать
Положение первого элемента в диапазоне копируемых элементов.

_Конец
Положение первого элемента за пределами диапазона копируемых элементов.

Замечания

Все конструкторы хранят объект _Al распределителя и инициализируют очередь.

Первый конструктор задает пустую начальную очередь и явно указывает используемый тип распределителя.

Второй конструктор указывает копию параллельной очереди _OtherQ.

Третий конструктор задает перемещение параллельной очереди _OtherQ.

Четвертый конструктор задает значения, предоставленные диапазоном итератора [ _Begin, ). _End

~concurrent_queue

Уничтожает параллельную очередь.

~concurrent_queue();

пусто

Проверяет, пуста ли конкурентная очередь в момент вызова этого метода. Этот метод является безопасным для параллелизма.

bool empty() const;

Возвращаемое значение

true если на момент проверки параллельная очередь была пуста, false в противном случае.

Замечания

Хотя этот метод безопасен для параллельного выполнения в отношении вызовов методов push, try_pop, и empty, возвращаемое значение может быть неверным к моменту проверки вызывающим потоком.

get_allocator

Возвращает копию аллокатора, используемого для создания параллельной очереди. Этот метод является безопасным для параллелизма.

allocator_type get_allocator() const;

Возвращаемое значение

Копия распределителя, используемая для конструирования параллельной очереди.

отправка

Добавляет элемент в хвост параллельной очереди. Этот метод является безопасным для параллелизма.

void push(const T& _Src);

void push(T&& _Src);

Параметры

_Src
Элемент, добавляемый в очередь.

Замечания

push является потокобезопасным с точки зрения вызовов методов push, try_pop, и empty.

try_pop

Удаляет элемент из очереди, если он доступен. Этот метод является безопасным для параллелизма.

bool try_pop(T& _Dest);

Параметры

_Dest
Ссылка на расположение для хранения отложенного элемента.

Возвращаемое значение

true значение, если элемент был успешно извлечён из очереди, false в противном случае.

Замечания

Если элемент был успешно удален, параметр _Dest получает извлеченное значение, исходное значение в очереди уничтожается, и эта функция возвращает true. Если элемент не был удален, эта функция возвращается false без блокировки, а содержимое _Dest параметра не определено.

try_pop является безопасным при одновременном выполнении вызовов методов push, try_pop и empty.

unsafe_begin

Возвращает итератор типа iterator или const_iterator в начало параллельной очереди. Этот метод не является безопасным для параллелизма.

iterator unsafe_begin();

const_iterator unsafe_begin() const;

Возвращаемое значение

Итератор типа iterator или const_iterator, указывающий на начало объекта параллельной очереди.

Замечания

Итераторы класса concurrent_queue в основном предназначены для отладки, так как они медленные, и итерация не является потокобезопасной по отношению к другим операциям с очередью.

небезопасный_конец

Возвращает итератор типа iterator или const_iterator в конец параллельной очереди. Этот метод не является безопасным для параллелизма.

iterator unsafe_end();

const_iterator unsafe_end() const;

Возвращаемое значение

Итератор типа iterator или const_iterator до конца параллельной очереди.

Замечания

Итераторы для класса concurrent_queue в основном предназначены для отладки, так как они медленные, а итерация не является безопасной при параллельном выполнении по отношению к другим операциям очереди.

небезопасный_размер

Возвращает количество элементов в очереди. Этот метод не является безопасным для параллелизма.

size_type unsafe_size() const;

Возвращаемое значение

Размер параллельной очереди.

Замечания

unsafe_size не является безопасным для параллелизма и может создавать неправильные результаты, если он вызывается одновременно с вызовами методов push, try_popи empty.

См. также

Пространство имен параллелизм