首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux的“互斥锁”是否使用“内存屏障”实现?

linux的“互斥锁”是否使用“内存屏障”实现?
EN

Stack Overflow用户
提问于 2015-11-17 10:20:51
回答 2查看 1.2K关注 0票数 4

我读过,其中Robert提到互斥锁是使用内存屏障实现的,但我无法看到在互斥锁的Linux实现中使用的内存屏障指令。

我想知道他是否指posix库中的互斥锁实现,它确实使用内存障碍指令,这样就不会对关键资源进行重新排序。我说的对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 11:38:11

罗伯特·洛夫的答案适用于任何领域的互斥。

您所引用的Linux内核中的实现使用__mutex_fastpath_lock,它完成了大部分工作,并且通常使用汇编程序代码实现。例如,在x86_64上,它的实现可以是:

代码语言:javascript
复制
 20 static inline void __mutex_fastpath_lock(atomic_t *v,
 21                                          void (*fail_fn)(atomic_t *))
 22 {
 23         asm_volatile_goto(LOCK_PREFIX "   decl %0\n"
 24                           "   jns %l[exit]\n"
 25                           : : "m" (v->counter)
 26                           : "memory", "cc"
 27                           : exit);
 28         fail_fn(v);
 29 exit:
 30         return;
 31 }

这里的关键是dec (decl)操作之前的锁前缀(decl)。在x86上,锁前缀意味着原子性,而总是暗示着完全的内存屏障

票数 11
EN

Stack Overflow用户

发布于 2015-11-17 11:46:27

实际上,互斥需要一些内存同步。重要的是如何在没有繁忙自旋锁的情况下等待互斥锁(由其他线程解锁)(特别是,因为您不希望等待线程占用大量CPU)。阅读关于futex(7)的文章。与克隆(2)一样,futex(2)系统调用只对线程库的实现者有用。

顺便说一下,GNU libcmusl-libc都是POSIX线程的https://en.wikipedia.org/wiki/Free_software实现。因此,如果您想了解详细信息,会研究它们的源代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33754443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档