gpt4 book ai didi

c++ - 不持有锁的本地静态初始化避免了 C++11 中可能出现的死锁?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:35 25 4
gpt4 key购买 nike

论文http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm提出了一种算法,该算法在局部静态变量的初始化期间不需要持有锁,但仍会导致通过变量定义的并发控制流等待初始化完成。

论文说这样做的好处是避免了可能出现的死锁

The core problem with function-local static-duration object initialization is that the containing function may be invoked concurrently, and thus the definition may execute concurrently. Failing to synchronize may introduce a race condition. The obvious solution is to synchronize. The problem is that such synchronization may introduce deadlock if the synchronization involves holding a lock while the initializer executes.

有人可以举例说明上述死锁发生的地方吗?

最佳答案

如果您要在本地静态初始化期间持有锁,则有两种可能的设计:

  1. 为每个静态分配一个互斥体。
  2. 只为所有静态分配一个互斥体。

我不是 100% 肯定,但我相信你引用的引用隐含地假设了设计 2。事实上,论文中介绍的算法只对所有静态使用一个互斥量(称为 mu在代码中)。

在设计 2 下,您会遇到 this stack overflow answer 所述的死锁.也就是说,除非您在进行初始化时实际上没有持有互斥锁。这是通过每个静态都有一个三态标志来实现的,该标志指示以下之一:未初始化、正在初始化、已经初始化。并使用全局互斥锁设置标志,但在初始化期间将其解锁。

关于c++ - 不持有锁的本地静态初始化避免了 C++11 中可能出现的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com