我明白我使用互斥體,但我不明白它是如何工作的。我的意思是它是如何工作的。
它在鎖定時如何排除其他線程或進程,它如何知道當前所有者等? 有人可以發佈關於它的好文章的鏈接嗎?我只是從程序員的角度發現它的工作原理,而不是它的實現。互斥體的內部結構是什麼?
回答
根據平臺/語言它的實現方式不同。我覺得圍棋的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. Node.js和互斥體
- 13. Ruby和互斥體
- 14. EventQueues和互斥體
- 15. 互斥體機制
- 16. 提升interprocess互斥體vs提升線程互斥體
- 17. 使用Allegro互斥體創建互斥體類
- 18. 在運行時選擇互斥體或虛擬互斥體
- 19. Silverlight中的互斥體
- 20. Win32中的互斥體
- 21. 與smp的Java互斥體
- 22. 互斥或不互斥互斥?
- 23. 爲什麼我不能使用原語作爲syncronized部分的互斥體?
- 24. ReleaseMutex之前在互斥體上的CloseHandle - 會發生什麼?
- 25. JavaScript中是否需要互斥體?
- 26. (編輯:MFC)CString類的對象的內部結構是什麼?
- 27. 什麼是EPIC體系結構?
- 28. .NET MVC體系結構是什麼?
- 29. Interface Builder .xib文件的內部結構是什麼?
- 30. 線程和互斥體
非常感謝!這是我需要的。 –