1

我有一个多进程和多线程的服务器。处理请求时的子进程会更新一些统计信息。此统计数据是由所有子进程更新的结构。这些子进程中的每一个都是多线程的。子进程的数量根据请求的数量是动态的(增加或减少)。

为了同步写入这个 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() 中保留。我错过了什么?

4

0 回答 0