首页 > 解决方案 > 在用户和内核空间之间配对获取/释放操作

问题描述

我试图确保在用户线程和在 Linux 上以内核模式运行的另一个线程之间共享的一块内存上正确同步。

atomic_store_explicit(memory_order_release)将来自用户空间的 C11与smp_load_acquire()来自内核中的 C11 以及分别atomic_load_explicit(memory_order_acquire)smp_store_release()

标签: clinux-kernelmemory-barriersmemory-modelstdatomic

解决方案


是的,当访问内核和用户之间共享的内存(例如 via )时,将 C11 atomic memory_order_releaseand memory_order_acquirein user space 与对应的smp_load_acquireand in kernel space配对绝对有意义。smp_store_releasemmap()

获取/释放语义在 C11 和 Linux 内核中都提供了类似的保证,如果发现它们在机器指令中的实现不兼容会很奇怪。

虽然 C11 允许“非原子”(太大)类型的原子指令,这可以通过锁来实现,但 Linux 内核禁止使用smp_load_acquiresmp_load_release非原子”类型。因此,通过用户空间锁实现 C11 原子是没有风险的,这当然不会影响内核。


推荐阅读