glibc的atomic_forced_read函数的作用是什么?

时间:2019-09-24 14:29:15

标签: c atomic glibc inline-assembly libc

我试图了解对atomic_forced_read的定义的目的,该定义经常出现在malloc.c的GNU libc实现中。

对于内联汇编,我并不是很好,但是看起来这返回的值与输入值的类型完全相同。我在这里想念什么?

atomic.h中的原子强制读取定义

fig, ax = plt.subplots()
year.plot(ax=ax)
fatalities.plot(ax=ax)

链接到atomic.h

https://code.woboq.org/userspace/glibc/include/atomic.h.html

1 个答案:

答案 0 :(得分:3)

一种用法是atomic_forced_read

#if HAVE_MALLOC_INIT_HOOK
  void (*hook) (void) = atomic_forced_read(__malloc_initialize_hook);
  if (hook != NULL)
    (*hook)();
#endif

似乎可以从另一个线程更改__malloc_initialize_hook,因此,如果__malloc_initialize_hook检查后从内存中再次加载NULL,则其值可能已更改回{{1 }}。

NULL确保由于atomic_forced_read的输出约束而将__malloc_initialize_hook加载到寄存器中,以便在{{1}之后不会从内存中重新加载=r }检查。空的__malloc_initialize_hook打破了NULLasm的编译器依赖性,因为hook现在使用存储在寄存器中的__malloc_initialize_hook而不是hook进行了初始化。 __x__malloc_initialize_hook初始化后,后者消失了,无法重新加载。


在C11模式下,hook可以是__x,并且可以使用__malloc_initialize_hook而不是atomic_uintptr_t从内存中加载atomic_load_explicit(&__malloc_initialize_hook, memory_order_relaxed)一次。