2017-05-13 55 views
1

我明白我使用互斥體,但我不明白它是如何工作的。我的意思是它是如何工作的。
它在鎖定時如何排除其他線程或進程,它如何知道當前所有者等? 有人可以發佈關於它的好文章的鏈接嗎?我只是從程序員的角度發現它的工作原理,而不是它的實現。互斥體的內部結構是什麼?

回答

2

根據平臺/語言它的實現方式不同。我覺得圍棋的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

+0

非常感謝!這是我需要的。 –