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

时间:2011-09-28 17:09:03

标签: c linux multithreading gcc pthreads

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

我不关心比赛状况。

只有我关注的是写入和读取int值同时是内存安全吗?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

是的,在x86和x86-64上,只要您正在阅读的值正确对齐。 32位int,它们需要在4字节边界上对齐,以便在读取或写入时访问atomic,除非你离开你,否则几乎总会如此创建未对齐int的方法(比如,通过使用压缩结构或使用字节缓冲区进行流水线/指针算法)。

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

答案 2 :(得分:0)

在我所知道的所有Linux平台上,对齐int的读取和写入都是原子且安全的。你永远不会读到一个没有写过的值(没有单词撕裂)。你永远不会导致错误或崩溃。