Mar*_*iss 4 .net multithreading locking
当两个线程试图以完全相同的微秒锁定同一个对象时(或者可以测量CPU切片或指令的最小时间长度),会发生什么?
两个线程甚至可以在完全相同的并发时间执行指令,还是不可能使用今天的硬件?
我正在研究一个处理多线程的项目,任何线程都可以击败另一个线程到终点线,可以这么说.很自然地,问题是"当他们同时锁定时会发生什么?" 必须得到IMO的解决.
这是不可能的,锁不能做他们所承诺的.这需要处理器支持,因为它是唯一能够确保多个内核不会同时尝试访问同一内存位置的处理器.一个示例是这个汇编代码,由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处理器指令提供的原子的保证.它是任何现代核心都具有的指令,它的通用名称是"比较和交换".您可以在本维基百科文章中找到有关此说明的更多信息.