C++中的循环类型依赖项死锁
Circular type dependency deadlock in C++
让Foo
和Bar
是类型。 Foo
有一个Bar bar
成员,Bar
有一个Foo foo
成员:
struct Foo;
struct Bar;
struct Foo { Bar bar; };
struct Bar { Foo foo; };
这无法编译,因为必须定义Foo
才能定义Bar
,但在定义Bar
之前无法定义Foo
- 死锁。
这个问题有解决方案吗?
全能的标准:
§ 9.2/9
非静态 (9.4) 数据成员不得具有不完整的类型。在 特别是,类 C 不应包含类的非静态成员 C,但它可以包含指向类 C 对象的指针或引用。
和:
§ 9.2/19
如果标准布局类对象具有任何非静态数据成员,则其 地址与其第一个非静态数据的地址相同 成员。否则,其地址与其第一个地址相同 基类子对象(如果有)。
您可以使用
以下方案(即使用指针而不是具体对象):
struct Foo;
struct Bar;
struct Foo
{
Bar *bar;
};
struct Bar
{
Foo *foo;
};
并在代码中适当地分配/解除分配bar
和foo
。
原因:虽然你转发声明了你的结构,但编译器不知道如何在你的Foo
结构中分配Bar
具体的对象,因为它还没有看到Bar
的引用。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 如何重现 Boost 进程文档提示的死锁?
- 多线程Windows GUI应用程序中的死锁
- 为什么printf会导致与future.get的死锁,而cout则不会?
- C++中具有阻塞队列和障碍的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 避免并发等待对象中的死锁
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 当用2个螺纹锁定时,将recursive_mutex死锁
- 程序在 C++11 中使用条件变量进入死锁
- 一个线程提升的死锁
- 单个生产者/多个消费者死锁
- 当被调用方法使用调用方已锁定的同一锁时,如何避免死锁
- C++中的循环类型依赖项死锁