我明白我使用互斥体,但我不明白它是如何工作的。我的意思是它是如何工作的。
它在锁定时如何排除其他线程或进程,它如何知道当前所有者等? 有人可以发布关于它的好文章的链接吗?我只是从程序员的角度发现它的工作原理,而不是它的实现。互斥体的内部结构是什么?
回答
根据平台/语言它的实现方式不同。我觉得围棋的implementation不错遵循(不容易跟随,但更多的还是不太清楚)
那里,mutex
是两个领域,32个整数的结构:
如果互斥是不是已经锁定,则操作基本上相当于一个比较和交换指令:
// Fast path: grab unlocked mutex.
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
if race.Enabled {
race.Acquire(unsafe.Pointer(m))
}
return
}
比较和交换,从wikipedia,是:
在计算机科学中,比较并交换(CAS)是在多线程用于实现同步的原子指令。它将内存位置的内容与给定值进行比较,只有它们相同时,才会将该内存位置的内容修改为新的给定值。
函数签名看起来是这样的:
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
(?这是如何工作的,你问How does Compare and Swap work?)
如果互斥锁不解锁,那么Lock()
方法将有等待(阻止线程),直到它可以成功交换的值在Mutex
的状态。
有一点要记住的是,在内存中的特定的和不可改变的地址是保持一个Mutex
工作必不可少的,那就是,你无法复制一个互斥体的价值,并通过它 - 它/它的指针到内存中的共享空间。
有资源,在那里建立一个锁本身(虽然我觉得golangs或多或少短落实不够好)
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf
https://www.andrew.cmu.edu/course/15-440-s12/applications/ln/lecture6.html
实现是平台和语言特定的。
维基百科列出了几种流行的互斥算法和硬件解决方案。 https://en.wikipedia.org/wiki/Mutual_exclusion
Linux的futex的用那张https://en.wikipedia.org/wiki/Futex
还要检查前面的讨论
感谢您的联系!我读了维基,但用俄语...在英语中包含更多信息) –
- 1. 为什么互斥体不需要互斥体(并且该互斥体需要互斥体...)
- 2. 什么是“分裂互斥”?
- 3. 为什么我的互斥体类有时不会删除互斥体文件?
- 4. Linux内核互斥体
- 5. 为什么互斥体不被获取?
- 6. AIX是互斥体sempahores?
- 7. 互斥体和临界区之间的边界是什么?
- 8. 互斥锁:“阻塞”是什么意思?
- 9. 什么是默认互斥量属性?
- 10. 什么是消息队列更好?互斥体和cond或互斥体和信号量?
- 11. 规范互斥数据结构
- 12. 互斥地图数据结构
- 13. Ruby和互斥体
- 14. 互斥体机制
- 15. EventQueues和互斥体
- 16. Node.js和互斥体
- 17. 在运行时选择互斥体或虚拟互斥体
- 18. 提升interprocess互斥体vs提升线程互斥体
- 19. 使用Allegro互斥体创建互斥体类
- 20. Win32中的互斥体
- 21. Silverlight中的互斥体
- 22. 与smp的Java互斥体
- 23. 互斥或不互斥互斥?
- 24. 为什么我不能使用原语作为syncronized部分的互斥体?
- 25. ReleaseMutex之前在互斥体上的CloseHandle - 会发生什么?
- 26. JavaScript中是否需要互斥体?
- 27. (编辑:MFC)CString类的对象的内部结构是什么?
- 28. 什么是EPIC体系结构?
- 29. .NET MVC体系结构是什么?
- 30. Interface Builder .xib文件的内部结构是什么?
非常感谢!这是我需要的。 –