2014-10-18 454 views
2

我正在使用C#,我需要知道是否有1个线程读取,并且1个线程写入是安全的,不使用任何挥发物或锁。我只会读/写32位整数和布尔值。如果我有1个线程写入和1个线程读取int32,它是线程安全的吗?

+0

作者是否需要知道当前值(如增量)?如果是这样,绝对不是。 – Mephy 2014-10-18 04:16:54

+0

我认为在技术上它不是线程安全的,因为理论上某些体系结构上的编译器可以使用单独的指令读取/写入该int的四个字节中的每一个字节,在这种情况下,可以仅在两个字节已被处理。但实际上,我认为读写32位值(或64位体系结构中的64位)是原子性的,因此是线程安全的。 – 2014-10-18 04:28:46

回答

2

这几乎是线程不安全的代码的定义。如果你分析了线程代码中的需求,那么你总是精确地寻找这种模式。如果不锁定,那么读取的线程将观察对该变量的随机更改,完全与执行不同步并且完全随机时间。

你从C#内存模型得到的唯一保证就是一个INT布尔更新原子。一个昂贵的词,这意味着你不会意外地读取值中的一些字节具有新值并且一些具有旧值的值。这会产生一个完全随机的数字。并非每个值更新都是原子的,,和结构类型(包括可空<>和十进制)不是原子的。

在必要时不锁定会产生非常难以调试的问题。它们取决于时间点,并且程序倾向于解决时序变化不大的执行模式。但是,例如,当机器被另一个任务占用时突然改变。你的程序可以正常运行一周,然后当你收到一封电子邮件时失败一次:)这是不可篡改的。

相关问题