我正在使用 C#,我需要知道在不使用任何 volatile 或锁的情况下,1 个线程读取和 1 个线程写入是否安全。我只会读/写 32 位整数和 bool 值。
最佳答案
这几乎就是线程不安全代码的定义。如果您分析线程代码中锁的需求,那么您总是会寻找这种模式。如果不锁定,则读取的线程将观察到变量的随机更改,与其执行完全不同步,并且时间完全随机。
从 C# 内存模型中获得的唯一保证是 int 和 bool 更新是原子。这是一个昂贵的词,意味着您不会意外读取某个值,其中该值中的某些字节具有新值而某些字节具有旧值。这将产生一个完全随机的数字。并非每个值更新都是原子的,long、double 和结构类型(包括 Nullable<> 和 decimal)都不是原子的。
在必要时不锁定会产生极难调试的问题。它们取决于时序,并且程序往往会陷入时序变化不大的执行模式。但是,例如,当机器被另一任务占用时,情况可能会突然发生变化。您的程序可能会正常运行一周,然后当您收到电子邮件时会失败一次:) 这是无法调试的。
关于multithreading - 如果我有 1 个线程写入和 1 个线程读取 int32,它是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436249/