如果我有一个线程在写int32,一个线程读int32,它是线程安全的吗



我正在使用C#,我需要知道在不使用任何挥发物或锁的情况下,1个线程读取和1个线程写入是否安全。我只会读/写32位整数和布尔值。

这几乎是线程不安全代码的定义。如果您分析了线程代码中对的需求,那么您总是会寻找这种模式。如果你不锁定,那么读取的线程将观察到变量的随机变化,与它的执行完全不同步,而且是在完全随机的时间。

从C#内存模型中得到的唯一保证是intbool更新是原子。一个昂贵的词,意味着你不会意外地读取一个值,其中值中的一些字节有新值,而一些字节有旧值。这将产生一个完全随机的数字。并非每个值更新都是原子的,longdouble和结构类型(包括Nullable<>和decimal)都不是原子的。

在必要的地方不锁定会产生极其难以调试的问题。它们依赖于时序,程序倾向于进入时序变化不大的执行模式。但当机器被另一项任务占用时,这种情况会突然发生变化。你的程序可能会正常运行一周,然后在收到电子邮件时失败一次:)这是不可破解的。

最新更新