2011-09-28 28 views
6

我有多个线程读取相同的int变量。 和一个线程正在写入该值。从多线程读取int是否安全?

我不在乎比赛条件。

只有我关心的是同时写入和读取int值是否安全?

它不会导致任何应用程序崩溃。

+0

可能重复的[这是C++读取和int原子的写入(http://stackoverflow.com/questions/54188/are-c-reads-and-of-int-atomic) – Sjoerd

回答

4

是的,那应该没问题。我可以设想崩溃的唯一方法是如果其中一个线程释放支持该整数的内存。为了获得最佳结果,我还要确保整数在sizeof(int)边界处对齐。 (某些CPU不能访问在所有整数没有这种对准。其他用于对齐访问提供原子性较弱的保证。)的

+1

确保整数在的sizeof(int)的排列 能否请您提供更多关于我如何能做到这一点? –

+0

@VivekGoel在大多数情况下,你的编译器会为你做。但是有编译器具体的方法来完成这个,比如'__attribute __((aligned(4)))'GCC。 – asveikau

+0

@VivekGoel - 你也可以在运行时做一些检查,例如'((uintptr_t)&x)%sizeof(int)'应该为零。 (你可以甚至添加为一个'assert') – asveikau

0

在所有Linux平台上,我知道的,读取和排列廉政局的写是原子和安全。你永远不会读到一个没有写出来的值(没有词语撕裂)。你永远不会导致故障或崩溃。

+0

我认为这种广泛的声明确实需要参考。而且,在这种情况下,究竟_what_是否意味着一致? – sehe

+0

如果有人不知道对齐整数是什么,他们没有写多线程程序的业务。 –

+0

哦真正迷人。另外,方式过度泛化。那么,你当然不需要打扰。在SO上还有其他答案可以解决更多的问题。 – sehe

2

是,在x86和x86-64,只要你正在阅读的价值定位正确。 32位int S,他们需要以一个4字节边界上对齐访问读取或写入时,这将几乎永远是这样,除非你走出自己的方式创造对齐int S(比如说是atomic ,通过使用压缩结构或通过使用字节缓冲区执行转换/指针运算)。

您可能还想声明变量为volatile,以便编译器生成代码,每次访问时都会从内存中重新获取变量。这将阻止它进行优化,例如当它可能被另一个线程改变时将其缓存在寄存器中。

+0

挥发性和实际提对齐模 – sehe