c++ - 是否保证像 std::queue 这样的 C++ 标准库容器是可重入的?

标签 c++ multithreading

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

语言中有这样的保证吗?

最佳答案

标准说:

Except where explicitly specified in this standard, it is implementation-defined which functions in the Standard C++ library may be recursively reentered.

然后它继续指定一个函数必须是可重入的,如果我计算正确的话,零个案例。

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

假设例如可以从任何标准容器的 emplace_back 调用任何构造函数;如果用户希望消除任何不确定性,他必须避免在任何构造函数中调用任何 emplace_back。任何复制构造函数都可以从例如vector::resizesort,因此无法在复制构造函数中管理 vector 或进行排序。依此类推,随意。

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

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

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

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

我愿意

  • 完全忽略任何标准函数不可重入的可能性,除非很明显该函数不能合理地设置为可重入。
  • 向标准委员会提出问题。

关于c++ - 是否保证像 std::queue 这样的 C++ 标准库容器是可重入的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580990/

相关文章:

multithreading - 互斥锁、信号量和自旋锁之间的区别

ios - 重新路由期间Skobbler API的问题

sql-server - 控制 azure WebJob 函数调用

c++ - 从c++中的套接字返回值读取

c++ - 编译器在构造函数上提示 BOOST_CHECK_THROW

c++ - 查找多维数组的大小

c++ - Cmake 和 ninja 重建不必要的文件

c++ - 使用 xperf 分析网络事件

c# - 与 Oracle 的多个连接 - 多任务

c# - 确定从转储文件中抛出异常的线程