当两个线程试图在完全相同的微秒内(或任何可以测量 CPU 片或指令的最短时间长度)锁定同一个对象时会发生什么?
两个线程是否有可能在完全相同的并发时间执行指令,或者这对于今天的硬件来说是不可能的?
我正在从事一个处理多线程的项目,可以这么说,任何线程都可能击败另一个线程到达终点线。所以很自然地,“当它们都同时锁定时会发生什么?”的问题。必须解决 IMO。
当两个线程试图在完全相同的微秒内(或任何可以测量 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
处理器指令提供原子性保证。这是任何现代内核都具有的指令,它的通用名称是“比较和交换”。您将在此Wikipedia 文章中找到有关此说明的更多信息。