当两个线程在同一时间ATTEMPT锁定同一个资源时会发生什么?

Mar*_*iss 4 .net multithreading locking

当两个线程试图以完全相同的微秒锁定同一个对象时(或者可以测量CPU切片或指令的最小时间长度),会发生什么?

两个线程甚至可以在完全相同的并发时间执行指令,还是不可能使用今天的硬件?

我正在研究一个处理多线程的项目,任何线程都可以击败另一个线程到终点线,可以这么说.很自然地,问题是"当他们同时锁定时会发生什么?" 必须得到IMO的解决.

Han*_*ant 7

这是不可能的,锁不能做他们所​​承诺的.这需要处理器支持,因为它是唯一能够确保多个内核不会同时尝试访问同一内存位置的处理器.一个示例是这个汇编代码,由CLR的x86版本在其Monitor.TryEnter()方法中使用:

FASTCALL_FUNC CompareExchangeUP,12
        _ASSERT_ALIGNED_4_X86 ecx
        mov     eax, [esp+4]    ; Comparand
        cmpxchg [ecx], edx
        retn    4               ; result in EAX
FASTCALL_ENDFUNC CompareExchangeUP
Run Code Online (Sandbox Code Playgroud)

cmpxchg处理器指令提供的原子的保证.它是任何现代核心都具有的指令,它的通用名称是"比较和交换".您可以在本维基百科文章中找到有关此说明的更多信息.


sbl*_*lom 3

在几乎所有环境中,现代锁的设计使得两个线程不可能同时锁定一个对象。现代处理器可以让两个线程运行在两个不同的内核上,几乎同时尝试获取锁定,但它们都实现了同步机制,允许软件告诉它们不允许这样做

例如,x86-64 有MONITORMWAIT指令。它们本质上是在微处理器级别实现 .NET 的lock(){}System.Threading.Monitor.Wait()System.Threading.Monitor.Enter()/.Exit().