lock语句如何确保内部处理器同步?我有一个同时执行两个线程的小型测试应用程序。一个递增静态long_value,另一个递减它。我已确保使用ProcessThread.ProcessorAffinity,线程与不同的物理(无HT)内核相关联,以强制处理器间通信并确保它们在大量执行时间内重叠。当然,以下不会导致零:for(longi=0;i<10000000;i++){_value+=offset;}所以合乎逻辑的结论是:for(longi=0;i<10000000;i++){Interlocked.Add(ref_value,offset);这当然会导致零。但是,以下也会导致零:for(longi=0;i<10000000;i++){lock(_syncRoot){_value+=offset;}}当然,lock语句保证了读写不重排序,因为它使用了全栅栏。但是,我找不到有关处理器高速缓存同步的任何信息。没有任何缓存同步,我想我应该在两个线程都完成后看到0的偏差?有人可以向我解释lock/Monitor.Enter/Exit如何确保处理器缓存(L1/L2缓存)同步吗?在这种情况下,缓存一致性不依赖于锁。如果使用lock语句,则确保汇编程序命令不会混合。a+=b不是处理器原语,它看起来像:没有锁定它可能是:但这与缓存一致性无关,它是更高级别的功能。所以锁并不能保证缓存是同步的。缓存同步是处理器内部函数,不依赖于代码。你可以在这里读到它。当一个核心将一个值写入内存时会发生缓存未命中,然后当第二个核心尝试读取该值时,除非其缓存条目无效,否则它的缓存中不会有实际副本。并且此缓存未命中会强制使用实际值更新缓存条目。CLR内存模型保证(要求)加载/存储不能越过栅栏。CLR实现者可以在真实硬件上强制执行此操作。但是,这是基于硬件的广告/理解行为,这可能是错误的。lock关键字只是一对System.Threading.Monitor.Enter()和System.Threading.Monitor.Exit()调用的语法糖。Monitor.Enter()和Monitor.Exit()建立一个内存条,需要执行适当的架构缓存刷新。因此,您的其他线程在看到执行的锁定部分生成的存储之前不会继续。以上是C#学习教程:lock语句如何保证处理器内部同步?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
