2017-05-13 21 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

非常感谢!这是我需要的。 –