C 从多个线程读取int是否安全?

C 从多个线程读取int是否安全?,c,linux,multithreading,gcc,pthreads,C,Linux,Multithreading,Gcc,Pthreads,我有多个线程读取相同的int变量。 一个线程正在写入值 我不在乎比赛情况 我唯一关心的是同时写入和读取int值是内存安全的吗 而且它不会导致任何应用程序崩溃 在我所知的所有Linux平台上,对齐int的读写都是原子的和安全的。您将永远不会读取未写入的值(无字撕裂)。您永远不会导致故障或崩溃。是的,在x86和x86-64上,只要您读取的值正确对齐。32位ints,它们需要在4字节边界上对齐,以便在读取或写入时进行访问,这几乎总是如此,除非您特意创建未对齐的ints(例如,使用压缩结构或使用字节缓冲

我有多个线程读取相同的int变量。 一个线程正在写入值

我不在乎比赛情况

我唯一关心的是同时写入和读取int值是内存安全的吗


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

在我所知的所有Linux平台上,对齐int的读写都是原子的和安全的。您将永远不会读取未写入的值(无字撕裂)。您永远不会导致故障或崩溃。

是的,在x86和x86-64上,只要您读取的值正确对齐。32位
int
s,它们需要在4字节边界上对齐,以便在读取或写入时进行访问,这几乎总是如此,除非您特意创建未对齐的
int
s(例如,使用压缩结构或使用字节缓冲区执行强制转换/指针运算)


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

是的,这应该没问题。我能想象崩溃的唯一方法是,如果其中一个线程释放支持该整数的内存。为了获得最佳结果,我还要确保整数在
sizeof(int)
边界处对齐。(一些CPU在没有这种对齐的情况下根本无法访问整数。其他CPU为未对齐的访问提供了较弱的原子性保证。)

可能的重复确保整数在sizeof(int)处对齐,您能提供更多信息吗?我如何做到这一点?@VivekGoel在大多数情况下,您的编译器将为您完成这项工作。但是有一些特定于编译器的方法可以实现这一点,例如GCC的
\uuuu属性(对齐(4))
。@VivekGoel-您也可以在运行时检查这一点,即
((uintptr\u t)&x)%sizeof(int)
应该为零。(你甚至可以为此添加一个
assert
)@asveikau对于gcc来说更具可移植性的应该是
\uuuu属性(对齐(\uuu最大值\uu对齐))
@user411313+1。我只写了4篇作为例子。我认为这种广泛的主张真的需要参考。还有,在这个上下文中对齐到底意味着什么?如果有人不知道对齐整数是什么,他们就没有必要编写多线程程序。哦,真迷人。而且,过于笼统。当然,你不必费心了。还有其他的答案,以便更清楚地了解。代码可以获取变量的过时值。例如,如果它来自寄存器(因为代码优化)。@Shamit:这是正确的。OP说他不在乎比赛状态。volatile为+1,实际上提到了对齐模数