【问题标题】:Where can I find the function definition in atomicity.h?我在哪里可以找到 atomicity.h 中的函数定义?
【发布时间】:2013-09-15 06:35:49
【问题描述】:

atomicity.h 是 c++ stl 的一部分。在其源文件中,它声明了两个关于原子操作的函数。这是整个源代码。我在哪里可以找到这些函数的定义。我在stl源代码中没有找到。

#ifndef _GLIBCXX_ATOMICITY_H
#define _GLIBCXX_ATOMICITY_H    1
#include <bits/atomic_word.h>
namespace __gnu_cxx
{
  _Atomic_word 
  __attribute__ ((__unused__))
  __exchange_and_add(volatile _Atomic_word* __mem, int __val); 

  void
  __attribute__ ((__unused__))
  __atomic_add(volatile _Atomic_word* __mem, int __val); 
} // namespace __gnu_cxx
#endif 

【问题讨论】:

  • atomicity.h 不是 C++ STL 的一部分...
  • 您的包含保护表明您正在查看 C++ 标准库的 GCC 实现,不是 STL。那么,您是在寻找 STL 中的 atomicity.h 标头,还是在 GCC C++ 标准库中寻找其他东西? C++ 标准库没有定义 atomicity.h 标头,但实现很可能有一个。

标签: c++ stl libstdc++


【解决方案1】:

它们由 libstdc++ 定义,具体取决于您的 GCC 安装,但对于最近的 GCC 版本,很容易找到:

$ cat t.cc
#include <ext/atomicity.h>

int main()
{
  int i=0;
  __gnu_cxx::__exchange_and_add(&i, 0);
}
$ g++ -g t.cc
$ gdb -quiet ./a.out
Reading symbols from /dev/shm/a.out...done.
(gdb) start 
Temporary breakpoint 1 at 0x8570: file t.cc, line 5.
Starting program: /dev/shm/a.out 

Temporary breakpoint 1, main () at t.cc:5
5     int i=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.16-33.fc18.armv7hl libgcc-4.7.2-8.fc18.armv7hl libstdc++-4.7.2-8.fc18.armv7hl
(gdb) n
6     __gnu_cxx::__exchange_and_add(&i, 0);
(gdb) step
__gnu_cxx::__exchange_and_add (__mem=0x7efff13c, __val=0)
    at /usr/lib/gcc/armv7hl-redhat-linux-gnueabi/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:48
48    { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
(gdb) 

GDB 告诉你定义在哪里,在我的例子中它在 /usr/lib/gcc/armv7hl-redhat-linux-gnueabi/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h 中,即它们在 atomicity.h 中内联定义

从您发布的代码看来,您使用的是 GCC 4.1(相当旧),在这种情况下,函数是在库中定义的,而不是在标头中。该代码是特定于 CPU 的,因此它再次取决于您的 GCC 安装。代码可以在 GCC 源代码中找到,i386 的实现在文件 libstdc++-v3/config/cpu/i386/atomicity.h 中,i486 及更高版本的实现在 libstdc++-v3/config/cpu/i486/atomicity.h

【讨论】:

  • 安装了 GCC 4.9 的 ARM 开发板上是否可以使用这些功能?我正在使用 Clang 3.5.0 进行测试,但无法链接错误,In function __gnu_cxx::__exchange_and_add(int volatile*, int): /usr/bin/../lib/gcc/arm-linux-gnueabihf/4.9/../../../../include/c++/4.9/ext/atomicity.h:49: undefined reference to __atomic_fetch_add_4
  • @jww 这是一个完全独立的问题。该函数显然是可用的,因为您正在调用它。您得到的错误来自该函数的定义。如果__atomic 内置函数导致调用外部函数,那么您需要链接到libatomic
  • 谢谢。我将提交一份 Clang 错误报告。我们不打电话给__exchange_and_add。我怀疑 Clang 将其称为 C++11 的动态初始化和并发销毁。
  • @jww 我非常怀疑 Clang 是否会自动生成对该函数的调用。它会被 libstdc++ 中的其他东西调用。
【解决方案2】:

&lt;atomicity.h&gt; 是 Linux 库的一部分。我认为它被捆绑到 libc 中。它不是 STL 或任何 C++ 标准的一部分。它是 Linux 特定的标头。

话虽如此,__exchange_and_add 可能根本不是一个函数。 GCC 内部支持多种行为,原子操作往往属于该组。

【讨论】:

  • 不,它们是libstdc++定义的函数
  • 进一步扩展,它不是 STL 或 C++ 标准的一部分,而是 libstdc++ 的实现细节。这是一个正常的函数,但如果可用的话会使用 GCC 的内置原子操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多