是否保证c ++标准库容器(如std :: queue)是可重入的?

最高

我见过有人建议我将标准容器(例如std :: queue和std :: vector)包装在互斥锁或类似的锁中,如果我想使用它们的话。我读到,需要为多个线程访问的每个容器实例的锁而不是每种类型或c ++标准库的任何使用都需要一个锁。但这假设标准容器和标准库被保证是可重入的。

语言上有这样的保证吗?

代词

该标准说:

除非在本标准中明确指定,否则由实现定义,可以递归地重新输入Standard C ++库中的哪些函数。

然后,它继续指定函数必须重入(如果我正确地将其归零)为零。

如果要严格遵守这一方面的标准,则标准库的用途突然变得相当有限。大量的库函数调用用户提供的函数。这些函数的编写者,尤其是那些本身作为库发布的函数,通常不知道从何处调用它们。

完全合理的假设是,例如可以从emplace_back任何标准容器中调用任何构造函数如果用户希望消除任何不确定性,则必须避免emplace_back在任何构造函数中进行任何调用任何副本构造函数都可以从vector::resize调用sort,因此无法管理向量或在副本构造函数中进行排序。依此类推,随意使用。

这包括调用可能合理使用标准库的任何第三方组件。

所有这些限制加在一起可能意味着标准库的很大一部分根本无法在现实世界的程序中使用。

更新:甚至还没有开始考虑线程。对于多线程,至少必须处理容器和算法的函数是可重入的。想象一下,这std::vector::operator[]不是可重入的。这意味着无法从两个不同的线程同时访问两个不同的向量!这显然不是该标准的意图。我了解这是您的主要兴趣。重申一下,不,我认为没有可重入保证。不,我认为没有这种保证在任何方面都是合理的。---结束更新。

我的结论是,这可能是一个疏忽。除非另有说明,否则该标准应规定所有标准功能必须是可重入的。

我会

  • 完全忽略任何标准功能都不可重入的可能性,除非很明显无法合理地使该功能不可重入。
  • 向标准委员会提出问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C中的可重入和可重入?

除了std :: string之外,sso是否还用于其他任何标准库容器中?

该标准是否保证std :: vector占用的总内存可缩放为C + N * sizeof(T)?

标准库容器的结构中是否有未使用的变量?

如何编写采用通用C ++标准库容器的模板函数

C ++:打印或退出标准库容器以进行控制台

您如何为标准库容器定义 C++ 概念?

Z80 NMI是否可重入?

C标准是否保证#error指令的诊断消息?

堆栈展开是否有c ++标准所保证的异常?

C ++标准是否保证插入关联容器失败不会修改rvalue-reference参数?

C++ 标准是否保证有关在空容器上运行的算法的任何内容?

标准C ++ 11是否保证std :: async(std :: launch :: async,func)在单独的线程中启动func?

C++ 是否保证 std::placeholders::_N 的最小数量?

C ++:是否保证std :: unordered_map是基于节点的?

C ++标准是否保证std :: basic_string :: npos + 1 == 0?

C ++ 11标准是否保证std :: atomic <>被实现为无锁操作?

为什么在C ++ 20中从标准库容器中删除了比较运算符?

如何在C ++ 11中有效选择标准库容器?

C ++何时标准库容器中的typedef不是您所期望的?

有关所包含对象的C ++标准库容器线程安全性

'const static' STL 容器在可重入函数中

显式使用strtok是否足以使其可重入?

ARM C 中的可重入函数是否可能存在寄存器值损坏?

对于具有默认分配器的标准容器,std :: container :: size_type是否保证为size_t?

在多核系统的可移植C代码中,“ volatile”是否完全可以保证?

Objective-C foreach是否保证可枚举对象仅被调用一次?

标准C ++ 11是否可以保证传递给函数的临时对象在函数结束后将被销毁?

标准C ++ 11是否保证在调用函数之前已经创建了传递给函数的临时对象?