我在哪里可以找到atomicity.h中的函数定义?

时间:2013-09-15 06:35:50

标签: c++ stl libstdc++

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 

2 个答案:

答案 0 :(得分:0)

atomicity.h是Linux库的一部分。我认为它被捆绑到libc中。它不是STL或任何C ++标准的一部分。这是一个特定于Linux的标题

话虽如此,__ exchange_and_add可能根本不是一个功能。 GCC内部支持几种行为,原子操作往往属于该组。

答案 1 :(得分:0)

它们由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