我有一个多进程和多线程的服务器。子进程在处理请求时更新一些统计信息。此统计数据是由所有子进程更新的结构。这些子进程中的每一个都是多线程的。根据请求的数量,子进程的数量是动态的(增加或减少)。
要同步写入此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()中保留映射类型。我错过了什么?