gpt4 book ai didi

c++ - 函数作用域的静态变量如何导致与共享库中函数代码的 future 使用不兼容

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:08 26 4
gpt4 key购买 nike

规则 3.3.1 HIC++ Coding标准限制使用具有静态存储持续时间的变量,即使它们是在 block 范围内声明的:

The order of initialization of block scope objects with static storage duration is well defined. However, the lifetime of such an object ends at program termination, which may be incompatible with future uses of the code, e.g. as a shared library.

Application const & theApp()  
{
static Application app; // Non-Compliant
return app;
}

问题是不相容会发生什么。

更新。在收到@Employed-Russian 的合理评论后,我意识到需要进行一些澄清。我可以想象多进程访问静态变量的一些问题。例如,在某些 Linux 实现中,相同的内存与 fork 进程共享,直到第一次内存写入。它称为写时复制。所以如果我们在这样的系统上执行以下代码

#include <iostream>
#include <unistd.h>

using namespace std;

struct A
{
A() {cout << __FUNCTION__ << '\n';}
~A() {cout << __FUNCTION__ << '\n';}
};

static void f()
{
static A a;
}

int main()
{
f();

fork();

return 0;
}

我们可以得到类似的输出

A
~A
~A

就是这样,两次调用析构函数和一次调用构造函数。这可能不应该是因为在其他系统上我们可以获得 A ~A A ~A。所以我们可以想象静态变量的一些共同问题,但是共享库和 block 作用域静态的特殊问题是什么?

最佳答案

The question is what the incompatibilites can occur.

例如,在调用 exit 之前并非所有线程都终止的多线程程序中,库可能变得不可用。

也就是说,如果线程 T0 调用了 exit,那么 Application 析构函数将在某个时候被调用(因为它是用 注册的>在第一次调用 theApp() 时退出

如果线程 T1 仍在运行,并且具有对 theApp.app 的引用,它现在将具有对已销毁对象的引用,并且可能会崩溃。

这被称为导出竞争,并且可能是高度不可复制的(如果 T0T1 有机会崩溃之前到达 sys_exit ,您将观察到正常退出)。

更新:

double call of destructor. Which isn't supposed to be

错了:这完全正常工作。这里没有对析构函数的双重调用:您有两个进程,每个进程都销毁自己的对象(正如它应该的那样)。

关于c++ - 函数作用域的静态变量如何导致与共享库中函数代码的 future 使用不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59008110/

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