我有多个线程读取相同的int变量。 并且一个线程正在写入值。
我不关心比赛状况。
只有我关注的是写入和读取int值同时是内存安全吗?
并且不会导致任何应用程序崩溃。
答案 0 :(得分:4)
是的,那应该没问题。我可以设想崩溃的唯一方法是,如果其中一个线程释放支持该整数的内存。为了获得最佳结果,我还要确保整数在sizeof(int)
边界处对齐。 (有些CPU在没有这种对齐的情况下根本无法访问整数。其他CPU为未对齐访问提供了较弱的原子性保证。)
答案 1 :(得分:3)
是的,在x86和x86-64上,只要您正在阅读的值正确对齐。 32位int
,它们需要在4字节边界上对齐,以便在读取或写入时访问atomic,除非你离开你,否则几乎总会如此创建未对齐int
的方法(比如,通过使用压缩结构或使用字节缓冲区进行流水线/指针算法)。
您可能还希望将变量声明为volatile
,以便编译器生成代码,每次访问时都会从内存中重新获取变量。这将阻止它进行优化,例如当它可能被另一个线程改变时将其缓存在寄存器中。
答案 2 :(得分:0)
在我所知道的所有Linux平台上,对齐int的读取和写入都是原子且安全的。你永远不会读到一个没有写过的值(没有单词撕裂)。你永远不会导致错误或崩溃。