当两个线程试图在完全相同的时间锁定同一资源时会发生什么



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

两个线程是否有可能在完全相同的并发时间执行指令,或者这在当今的硬件中是不可能的?

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

这是不可能的,锁无法实现它们所承诺的。这需要处理器支持,因为它是唯一一个可以确保多个内核不会同时访问同一内存位置的处理器。一个例子是这段汇编代码,由x86版本的CLR在其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

cmpxchg处理器指令提供原子性保证。这是任何现代核心都有的指令,它的通用名称是"比较和交换"。你可以在维基百科的这篇文章中找到更多关于这个指令的信息。

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

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

最新更新