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
答案 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