mmap跨子进程写入同步

时间:2012-12-07 08:16:16

标签: c multithreading synchronization mmap multiprocess

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

要同步写入此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()中保留映射类型。我错过了什么?

0 个答案:

没有答案