我试图了解对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
答案 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
打破了NULL
对asm
的编译器依赖性,因为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)
一次。