【发布时间】:2011-11-27 01:36:37
【问题描述】:
我有多个线程读取相同的 int 变量。 一个线程正在写入值。
我不关心比赛条件。
只有我关心的是同时写入和读取 int 值是否内存安全?
它不会导致任何应用程序崩溃。
【问题讨论】:
标签: c linux multithreading gcc pthreads
我有多个线程读取相同的 int 变量。 一个线程正在写入值。
我不关心比赛条件。
只有我关心的是同时写入和读取 int 值是否内存安全?
它不会导致任何应用程序崩溃。
【问题讨论】:
标签: c linux multithreading gcc pthreads
在我所知道的所有 Linux 平台上,对齐 int 的读取和写入都是原子且安全的。您永远不会读取未写入的值(无字撕裂)。您永远不会导致故障或崩溃。
【讨论】:
是的,在 x86 和 x86-64 上,只要您读取的值正确对齐。 32 位 ints,它们需要在 4 字节边界上对齐,以便在读取或写入时访问为 atomic,除非您不遗余力地创建未对齐的,否则几乎总是如此ints(例如,通过使用压缩结构或使用字节缓冲区进行强制转换/指针运算)。
您可能还希望将变量声明为volatile,以便编译器生成代码,每次访问该变量时都会从内存中重新获取该变量。这将阻止它进行优化,例如当它可能被另一个线程更改时将其缓存在寄存器中。
【讨论】:
是的,应该没问题。我可以设想崩溃的唯一方法是如果其中一个线程取消分配支持该整数的内存。为了获得最佳结果,我还将确保整数在sizeof(int) 边界处对齐。 (有些 CPU 在没有这种对齐方式的情况下根本无法访问整数。其他 CPU 为未对齐访问提供较弱的原子性保证。)
【讨论】:
__attribute__((aligned(4))) for GCC。
((uintptr_t)&x) % sizeof(int) 应该为零。 (您甚至可以为此添加assert。)
__attribute__ ((aligned (__BIGGEST_ALIGNMENT__)))