4

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

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

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

4

2 回答 2

7

这是不可能的,锁无法做到他们所承诺的。这需要处理器支持,因为它是唯一可以确保多个内核不会尝试同时访问同一内存位置的处理器。一个示例是这段汇编代码,由 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处理器指令提供原子性保证。这是任何现代内核都具有的指令,它的通用名称是“比较和交换”。您将在此Wikipedia 文章中找到有关此说明的更多信息。

于 2012-07-28T17:23:11.540 回答
3

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

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

于 2012-07-28T16:40:44.763 回答