作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当两个线程试图在完全相同的微秒(或 CPU 切片或指令可以测量的最小时间长度)锁定同一个对象时会发生什么?
两个线程是否有可能在完全相同的并发时间执行指令,或者这在今天的硬件中是不可能的?
我正在处理一个处理多线程的项目,可以这么说,任何线程都可以在终点线上击败另一个线程。所以很自然地,“当他们同时锁定时会发生什么?”的问题。必须解决 IMO。
最佳答案
这是不可能的,锁不能做他们 promise 的事情。这需要处理器支持,因为它是唯一可以确保多个内核不会尝试同时访问同一内存位置的内核。一个例子是这段汇编代码,由 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 article 中找到有关此说明的更多信息.
关于.net - 当两个线程试图同时锁定同一个资源时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702794/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!