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

时间:2012-07-28 16:38:01

标签: .net multithreading locking

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

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

我正在研究一个处理多线程的项目,可以说任何线程都可以击败另一个线程到终点线。很自然地,问题是“当他们同时锁定时会发生什么?”必须在国际海事组织处理。

2 个答案:

答案 0 :(得分: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

cmpxchg处理器指令提供原子性保证。它是任何现代核心都具有的指令,它的通用名称是“比较和交换”。您可以在Wikipedia article中找到有关此说明的更多信息。

答案 1 :(得分:3)

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

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