7
|
Chaowlert Chaisrichalermpol · 技术社区 · 16 年前 |
![]() |
1
6
x86 CPU(x86的lock add/dec)上的联锁增量/减量正在自动创建
记忆障碍
它使所有线程都可见(即,所有线程都可以按顺序查看其更新,如顺序内存一致性)。内存屏障将完成所有挂起的内存加载/存储。
请也看看 my another answer 在StackOverflow中。 请注意,我假设C的互锁增量/减量是到x86的lock add/dec的内在映射。 |
![]() |
2
6
这取决于您如何读取该值。如果您“只是”阅读它,那么不,除非您将其标记为易失性,否则它在其他线程中并不总是可见的。但这会引起一个恼人的警告。 作为另一种选择(也是更可取的IMO),使用另一个互锁指令读取它。这将始终看到所有线程上的更新值:
它返回读取的值,如果为0,则将其与0交换。 动机:警告意味着有些事情不对劲;结合这两种技术(易失性和互锁性)并不是达到目的的方法。
更新:另一种不使用“volatile”的可靠32位读取方法似乎是使用
我真正的意思是:不要把这个答案作为你唯一的来源,我对此有疑问。 |
![]() |
3
3
实际上,它们不是。如果您想安全地修改
|
![]() |
4
1
联锁确保一次只有一个线程可以更新该值。为了确保其他线程可以读取正确的值(而不是缓存值),请将其标记为volatile。 公共易失性int计数器; |
![]() |
5
1
没有; 仅在写入时互锁 不 确保在代码中读取的变量实际上是新的; 不能正确读取字段的程序。 可能不是线程安全的 即使是在“强记忆模式”下。这适用于分配给线程之间共享的字段的任何形式。 下面是一个永远不会终止的代码示例 由于JIT . (修改自 Memory Barriers in .NET 是为问题更新的可运行LinqPad程序)。
解释来自 .NET中的内存屏障 :
也就是说,另外 障碍 在读取端需要构造 防止编译和JIT重新排序/优化问题 : 这是一个不同于记忆连贯性的问题!
添加
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 6 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 6 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 6 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |