2

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 
4

2 回答 2

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.hie 他们被内联定义在atomicity.h

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

于 2013-09-20T12:28:47.460 回答
0

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

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

于 2013-09-15T06:57:05.007 回答