我见过有人建议我将标准容器(例如std :: queue和std :: vector)包装在互斥锁或类似的锁中,如果我想使用它们的话。我读到,需要为多个线程访问的每个容器实例的锁而不是每种类型或c ++标准库的任何使用都需要一个锁。但这假设标准容器和标准库被保证是可重入的。
语言上有这样的保证吗?
该标准说:
除非在本标准中明确指定,否则由实现定义,可以递归地重新输入Standard C ++库中的哪些函数。
然后,它继续指定函数必须重入(如果我正确地将其归零)为零。
如果要严格遵守这一方面的标准,则标准库的用途突然变得相当有限。大量的库函数调用用户提供的函数。这些函数的编写者,尤其是那些本身作为库发布的函数,通常不知道从何处调用它们。
完全合理的假设是,例如可以从emplace_back
任何标准容器中调用任何构造函数。如果用户希望消除任何不确定性,则必须避免emplace_back
在任何构造函数中进行任何调用。任何副本构造函数都可以从vector::resize
或调用sort
,因此无法管理向量或在副本构造函数中进行排序。依此类推,随意使用。
这包括调用可能合理使用标准库的任何第三方组件。
所有这些限制加在一起可能意味着标准库的很大一部分根本无法在现实世界的程序中使用。
更新:甚至还没有开始考虑线程。对于多线程,至少必须处理容器和算法的函数是可重入的。想象一下,这std::vector::operator[]
不是可重入的。这意味着无法从两个不同的线程同时访问两个不同的向量!这显然不是该标准的意图。我了解这是您的主要兴趣。重申一下,不,我认为没有可重入保证。不,我认为没有这种保证在任何方面都是合理的。---结束更新。
我的结论是,这可能是一个疏忽。除非另有说明,否则该标准应规定所有标准功能必须是可重入的。
我会
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句