原始数据类型是c#atomic(线程安全)吗?

例如,multithreading时是否需要锁定bool值?

没有primefaces类型这样的东西。 只有操作可以是primefaces的。

读取和写入适合单个字的数据类型(32位处理器上的intlong位于64位处理器上)在技术上是“primefaces的”,但抖动和/或处理器可以决定重新排序指令,从而创建意外的竞争条件,因此您需要使用lock序列化访问,使用Interlocked类进行写入(在某些情况下使用读取),或声明变量volatile

简短的回答是:如果两个不同的线程可以访问相同的字段/变量,并且其中至少有一个将要写入,则需要使用某种锁定。 对于原始类型,通常是Interlocked类。

类似问题在这里

有关最终答案,请转到规范。 🙂

CLI规范的第12.6.6节的分区I指出:“符合要求的CLI应保证当对位置的所有写访问都是相同大小时,对正确对齐的内存位置的读写访问权限不大于本机字大小是primefaces的“。

这样就确认了s_Initialized永远不会不稳定,并且对primitve类型的读写都是primefaces的。

互锁创建了一个内存屏障,以防止处理器重新排序读取和写入。 在此示例中,锁定创建了唯一必需的屏障。

约翰。

从本质上讲,你不会因为没有锁定bool而出现“崩溃”问题。 您可能拥有的是更新或读取布尔顺序的竞争条件。 如果你想要以特定的顺序写入/读取bool,那么你需要使用某种锁定机制。

有点。 这里有一个很好的线程,但是短版本是,虽然给定的读或写可能是primefaces的,但这几乎不是你正在做的。 例如,如果要增加整数,则需要1)读取值,2)将值加1,然后3)将值存回。 任何这些操作都可能被中断。

这就是“联锁”等课程的原因。

静态原始类型是线程安全的,因此您不需要锁定那些类型化的变量。 但是,不保证基本类型的任何实例变量。 看到这里: 像bool线程安全的原始类型?

MSDN PrimitiveType类

这是另一个有用的链接,也可能是我感兴趣的,我发现解决方案非常引人注目:SO问题: 我怎么知道C#方法是否是线程安全的?