【问题标题】:How thread safety is achieved with Sync blocks, in .Net CLR?在 .Net CLR 中,如何使用 Sync 块实现线程安全?
【发布时间】:2019-06-20 13:07:11
【问题描述】:

阅读后,我可以理解 C# 的 Lock 在内部使用 Monitor.Enter 并且 Monitor.Enter 通过使用 .Net CLR 的 Sync 块标志获取关键部分的锁。

但是,我有兴趣了解当 2 个并行线程同时执行以获取同步块标志时获取锁的逻辑/技术。 考虑到获取锁也是在用户代码之上的操作,怎么可能同一时间不同线程对共享资源的相同操作不会发生冲突。

【问题讨论】:

  • 看看这个link
  • 感谢@lilo0 spin-wait loop 和线程中的进一步解释向我解释了它是多么困难。我可以实现逻辑谢谢。

标签: .net multithreading


【解决方案1】:

Monitor.Enter 一直调用方法,直到您使用 CLR 内部实现的方法,所以我不知道 .net 具体是如何做到的,但是我(可能错误地)假设在 x86 上他们使用自旋锁

https://en.wikipedia.org/wiki/Spinlock

【讨论】:

  • 感谢 Ronan 为我指出 X86 的方式。我阅读了自旋锁 - 使用寄存器递归地等待直到锁被释放。但是 Wiki 并没有说明当 2 个线程同时竞争并执行相同的自旋锁时,将如何排序。这样一个线程就可以获取它。但是我可以从您的回答中假设的一件事是,处理器级别应该有一个逻辑来对尝试获取标志的并行调用进行排序。
  • @MuthukumarPalaniappan 在硬件级别得到保证,原子指令不仅“使用”寄存器,而且还查找(由核心/proc 共享的)内存,xchg 行。这意味着实际的硬件指令集保证在该指令“期间”不会发生任何可能影响其结果的事情。 [locked] 是您在 C# 中要锁定的变量的内存地址(变量)。因此,当一个线程进行交换时,另一个线程无法更改该值,这意味着您知道锁是否空闲,具体取决于您现在在 eax 中拥有的值
  • @MuthukumarPalaniappan 如果答案正确回答了您的问题,请不要忘记将答案标记为已接受。
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多