我编写了以下代码,由多个进程并行执行:
// spawn 10 times with id=0..9 by a master process.
void slave_processing(int id)
{
SHARED_TYPE last=id;
for(;;) {
/* each slave operates on a specific byte of the shared array. */
if (shared[id]!=last) fprintf(stderr,"S%i expected %i\n",id,last);
shared[id]+=id;
last+=id;
if (last>10*id) {last=0; shared[id]=0;}
}
}
它们都使用相同的(IPC/linux)共享内存,但每个都访问数组的一个单独条目。它可以在我的双核机器上完美运行,无论是 when SHARED_TYPE
isint
还是char
. 我使用积极优化 (-O3) 进行编译并检查组装的二进制文件以确认内存引用是针对shared[id]
访问执行的,并且寄存器用于last
.
然而,我很困惑。我曾预料到,在某个时候,来自一个核心的影响字节可能不会反映在来自另一个核心的缓存内容上。例如,一个核心可能在缓存中有 [xxyyzzuu] 并将 [xxyyZZuu] 写回内存,而同时另一个核心已将内存字升级为 [XXyyzzuu](假设每对 char 是我的 32 位字中的一个字节) .
linux是否在做一些神奇的设置,以便shmget
无法缓存获得的内存?或者是否正在进行一些低级缓存同步以确保核心#1 可以读取核心#2 的最新修改以更新所选字节而不会产生讨厌的副作用?
是否有任何其他(多核)架构您知道上述代码会在哪里失败(输入 fprintf)?