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 析构函数 | 销毁并发队列。 |
公共方法
名称 | 描述 |
---|---|
clear | 清除并发队列,销毁任何当前排队的元素。 此方法不是并发安全方法。 |
empty | 测试在调用此方法时并发队列是否为空。 此方法是并发安全的。 |
get_allocator | 返回用于构造并发队列的分配器的副本。 此方法是并发安全的。 |
push | 已重载。 在并发队列的尾端将项进行排队。 此方法是并发安全的。 |
try_pop | 如果队列中有可用的项,则取消将项进行排队。 此方法是并发安全的。 |
unsafe_begin | 已重载。 将 iterator 或 const_iterator 类型的迭代器返回到并发队列的开头。 此方法不是并发安全方法。 |
unsafe_end | 已重载。 将 iterator 或 const_iterator 类型的迭代器返回到并发队列的末尾。 此方法不是并发安全方法。 |
unsafe_size | 返回队列中的项数。 此方法不是并发安全方法。 |
备注
有关详细信息,请参阅并行容器和对象。
继承层次结构
concurrent_queue
要求
标头:concurrent_queue.h
命名空间: 并发
clear
清除并发队列,销毁任何当前排队的元素。 此方法不是并发安全方法。
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
指定值范围的输入迭代器的类型。
_Al
要用于此对象的分配器类。
_OtherQ
要从中复制或移动元素的源 concurrent_queue
对象。
_Begin
要复制的元素范围内的第一个元素的位置。
_End
要复制的元素范围外的第一个元素的位置。
注解
所有构造函数都存储一个分配器对象 _Al
并初始化队列。
第一个构造函数指定一个空的初始队列,并显式指定要使用的分配器类型。
第二个构造函数指定并发队列 _OtherQ
的副本。
第三个构造函数指定并发队列 _OtherQ
的移动。
第四个构造函数指定由迭代器范围 [ _Begin
, _End
) 提供的值。
~concurrent_queue
销毁并发队列。
~concurrent_queue();
empty
测试在调用此方法时并发队列是否为空。 此方法是并发安全的。
bool empty() const;
返回值
如果并发队列在我们查看时为空,则返回 true
,否则返回 false
。
备注
虽然此方法对于对 push
、try_pop
和 empty
方法的调用是并发安全的,但在调用线程检查返回的值时,返回的值可能不正确。
get_allocator
返回用于构造并发队列的分配器的副本。 此方法是并发安全的。
allocator_type get_allocator() const;
返回值
用于构造并发队列的分配器的副本。
push
在并发队列的尾端将项进行排队。 此方法是并发安全的。
void push(const T& _Src);
void push(T&& _Src);
参数
_Src
要添加到队列的项。
备注
对于对方法 push
、try_pop
和 empty
的调用,push
是并发安全的。
try_pop
如果队列中有可用的项,则取消将项进行排队。 此方法是并发安全的。
bool try_pop(T& _Dest);
参数
_Dest
对存储已取消排队的项的位置的引用。
返回值
如果已成功取消项的排队,则返回 true
,否则返回 false
。
备注
如果项已成功取消排队,参数 _Dest
将接收已取消排队的值,队列中保存的原始值将被销毁,并且此函数将返回 true
。 如果没有要取消排队的项,则此函数将在无阻塞的情况下返回 false
,并且参数 _Dest
的内容未定义。
对于对方法 push
、try_pop
和 empty
的调用,try_pop
是并发安全的。
unsafe_begin
将 iterator
或 const_iterator
类型的迭代器返回到并发队列的开头。 此方法不是并发安全方法。
iterator unsafe_begin();
const_iterator unsafe_begin() const;
返回值
指向并发队列对象开头的 iterator
或 const_iterator
类型的迭代器。
备注
concurrent_queue
类的迭代器主要用于调试,因为它们很慢,并且对于其他队列操作来说迭代不是并发安全的。
unsafe_end
将 iterator
或 const_iterator
类型的迭代器返回到并发队列的末尾。 此方法不是并发安全方法。
iterator unsafe_end();
const_iterator unsafe_end() const;
返回值
指向并发队列末尾的 iterator
或 const_iterator
类型的迭代器。
备注
concurrent_queue
类的迭代器主要用于调试,因为它们很慢,并且对于其他队列操作来说迭代不是并发安全的。
unsafe_size
返回队列中的项数。 此方法不是并发安全方法。
size_type unsafe_size() const;
返回值
并发队列的大小。
注解
unsafe_size
不是并发安全的,如果在调用方法 push
、try_pop
和 empty
的同时调用它,则可能会生成不正确的结果。