我有一个多进程和多线程的服务器。处理请求时的子进程会更新一些统计信息。此统计数据是由所有子进程更新的结构。这些子进程中的每一个都是多线程的。子进程的数量根据请求的数量是动态的(增加或减少)。
为了同步写入这个 stat 结构,我使用 mmap。这是地图的初始化方式。
fd = open(mapfile, O_CREAT|O_RDWR, 0666);
write(fd, dummy, MMAP_FILE_SIZE); //dummy is all zeros
void *addr = mmap(0, sizeof(stat_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
if (addr == (void *)-1) {
mapped = 0;
}
else {
gStat = (stat_t*)addr;
}
// here gStat struct is initialized
同样在我操作统计信息的代码中,我使用锁在进程内的多个线程之间进行同步。
现在,我遇到的问题是,在重负载下,写入似乎不同步。统计信息未正确更新。在正常负载下,统计数据会正确递增。
根据我的理解,如果指定了 MAP_SHARED,则写入引用会更改底层对象,并且映射类型会在 fork() 中保留。我错过了什么?