原子数据类型在C#原子(线程安全)?
例如,在多线程时,我需要锁定一个bool
值吗?
没有像原子类型那样的东西。 只有操作可以是原子的。
读取和写入装配到一个字(数据类型int
上的32位处理器, long
在64位处理器)在技术上是“原子”,但抖动和/或处理器可以决定指令重新排序,从而创造意外的竞态条件,所以你要么需要使用lock
序列化访问,使用Interlocked
类进行写操作(以及在某些情况下读取),要么声明变量volatile
。
简短的回答是:如果两个不同的线程可以访问相同的字段/变量,并且至少其中一个将写入,则需要使用某种锁定。 对于通常为Interlocked
类的原始类型。
类似问题在这里
为了明确的答案去规范。 :)
分区I,CLI规范的第12.6.6节指出:“符合CLI的应保证对所有对某个位置的写入访问都是相同大小时,对正确对齐的不大于本地字大小的内存位置的读取和写入访问是原子的“。
这证实了s_Initialized永远不会不稳定,读取和写入primitve类型是原子的。
互锁创建了一个内存屏障,以防止处理器重新排序读取和写入。 在这个例子中锁创建了唯一必需的屏障。
约翰。
从本质上讲,你不会因为没有锁定布尔而导致“崩溃”问题。 你可能拥有的是bool更新或阅读顺序的竞争条件。 如果你想要知道bool是以特定的顺序写入/读取的,那么你会想要使用某种锁定机制。
有点。 这里有一个很好的线索,但简短的版本是,而给定的读或写可能是原子,这几乎从来没有你在做什么。 例如,如果你想增加一个整数,你需要1)读取数值,2)给数值加1,3)存回数值。 任何这些操作都可能被中断。
这就是诸如“互锁”之类的原因。
链接地址: http://www.djcxy.com/p/78209.html