我正在使用C#,我需要知道是否有1个线程读取,1个线程写入是安全的,不使用任何挥发物或锁定。我只会读/写32位整数和布尔值。
答案 0 :(得分:2)
这几乎是线程不安全代码的定义。如果您在线程代码中分析 lock 的需求,那么您始终会查找此模式。如果你没有锁定,那么读取的线程将观察变量的随机变化,与其执行完全不同步,并且完全随机。
从C#内存模型中获得的唯一保证是 int 和 bool 更新是 atomic 。一个昂贵的单词意味着您不会意外地读取值中某些字节具有新值而某些字节具有旧值的值。哪个会产生一个完全随机的数字。并非每个值更新都是原子的, long , double 和结构类型(包括Nullable<>和 decimal )不是原子的。
在必要时不锁定会导致极难调试问题。它们依赖于时序,程序倾向于采用执行模式,其中时序变化不大。但是当机器被另一个任务占用时,突然可以改变。你的程序可以正常运行一周,然后当你收到电子邮件时失败一次:)这是不可取的。