例如,是否需要多线程时来锁定一个bool值?

有帮助吗?

解决方案

有没有这样的东西作为一个原子的输入的。只有操作可以是原子的。

读写装配到一个字一个数据类型(int上的32位处理器,一个64位处理器long)在技术上是“原子”,但抖动和/或处理器可以决定指令重新排序并因此产生意想不到的竞争条件,所以你要么需要序列与lock访问,用于写入的Interlocked类(以及在某些情况下读取),或声明变量volatile

在简短的回答是:如果两个不同的线程可以访问相同的字段/变量,其中至少有一个会写,你需要使用某种形式的锁定。基本类型,其通常是在Interlocked类。

其他提示

类似的问题此处

  

有关确切的答案转到   规范。 :)

     

分区I中,CLI第12.6.6   规范规定:“符合CLI须   保证读写访问   正确对齐的内存位置   不大于本地字长   当所有的写访问原子   的位置是相同的尺寸。“

     

因此,确认s_Initialized   永远是不稳定的,而阅读   并写入primitve类型   原子。

     

联锁创建内存屏障   以防止从处理器   重新排序的读取和写入。锁   会在仅要求屏障   该示例。

     

约翰。

从本质上讲,你不会有从没有锁定一个布尔值一“撞车”的问题。你可能已经是其中的布尔被更新或阅读顺序的竞争条件。如果你想garuntee的布尔写入/从一个特定的顺序读取,那么你想使用某种形式的锁定机制。

排序的。有一个关于这个一个优秀的线程这里,但短期的版本是,虽然给定读取或写入可以是原子,这是几乎从来没有你在做什么。例如,如果你想增加一个整数,你需要1)读出的值,2)添加一个值,并3)存储值回。任何这些操作可以被中断。

这对于类,如“交错”。

的原因

静态基本类型是线程安全的,所以你并不需要锁定那些类型变量。然而,一个基本类型的任何实例变量是,但不保证。在这里看到:是原始的类型,如布尔线程

MSDN PrimitiveType类

和这里的另一个有用的链接,也可能是因为我找到解决方案非常引人注目的兴趣:SO问题:的我怎么知道,如果一个C#方法是线程安全的吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top