gpt4 book ai didi

c++ - 关于 GNU ld 'legacy __sync_synchronize' 警告,我该怎么办?

转载 作者:行者123 更新时间:2023-11-30 02:17:11 25 4
gpt4 key购买 nike

我有一些使用局部作用域、程序生命周期对象的 C++ 代码,例如

void testFunction(int arg) {
static Tested tested(0);
tested.use(arg);
}

与旧版本的 GCC 构建良好。使用 GCC 8.2.0,我在链接时收到一个令人费解的警告:

警告:使用了遗留兼容的 __sync_synchronize。不适合多线程应用

它指向定义测试的行,确实存在编译器生成的对 __sync_synchronize() 的调用。我想这是为了确保没有两个线程可以同时运行初始化代码,并让延迟初始化产生与加载时初始化相同的结果。

问题在 Tested 类的这个实现中重现:

class Tested {
int sum;
public:
Tested(int init) : sum(init) {}
void use(int arg) {
sum += arg;
}
int current() const {
return sum;
}
};

此代码有望在单线程嵌入式平台上运行。

我认为警告与我无关是否正确?

我该怎么做(除了停止使用静态对象之外)来摆脱警告消息?

最佳答案

您将收到由该版本的 newlib 生成的链接器警告,告诉您您的应用程序调用了 __sync_synchronize 并且没有实现实际同步的函数。 newlib 中该函数的实现是一个什么也不做的 stub (它可能只是为了确保没有对该函数的 undefined reference 而存在)。

这些调用可能来自 libstdc++.so,因为 ARM 上的 GCC 将发出对 __sync_synchronize 的调用,以进行库内发生的一些原子操作(例如引用计数更新在 std::stringshared_ptr 对象中)。

要获得使原子正确的工作 __sync_synchronize,您可能需要链接到 libatomic(使用 -latomic),它将有一个该功能的实现。因为您没有链接到它,所以您在 newlib 中获得了后备 stub 实现。如果您不需要同步原子(因为您的应用程序是单线程的并且从不尝试更新信号处理程序中的原子),那么我认为您可以忽略该警告。

另一种选择是使用 libstdc++ 的构建。这样可以显式禁用所有线程,理论上不会有任何对 __sync_synchronize 的引用。但是 libstdc++.so 的构建只能用于单线程应用程序。您现在使用的构建可用于单线程和多线程代码(即使您收到与单线程情况不太相关的警告)。

关于c++ - 关于 GNU ld 'legacy __sync_synchronize' 警告,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54010151/

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