2016-10-06 9 views
0

Мне нужно обменять некоторые переменные в разных процессах и попробовать это через общую память. Следующий код является упрощенной версией этой попытки. Программа работает так, как ожидалось, но я хочу убедиться, что обмен не только работает из-за удачи.Каков правильный способ синхронизации доступа в mmaped регионе

Мой главный вопрос: достаточно ли объявить все указатели как изменчивые, чтобы убедиться, что компилятор не может оптимизировать прочтение памяти? Или мне нужно вставить некоторые дополнительные команды синхронизации?

#include <sys/mman.h> 
#include <iostream> 
#include <unistd.h> 
#include <fcntl.h> 
#include <type_traits> 

struct Exchange 
{ 
    int x; 
}; 

int main() 
{ 
    int fd = open("/dev/shm/foobar", O_RDWR | O_CREAT, 0600); 
    if(fd == -1) 
    { 
     std::cerr << "Open failed\n"; 
     return 1; 
    } 
    if(ftruncate(fd, sizeof(Exchange))) 
    { 
     close(fd); 
     std::cerr << "Resize failed\n"; 
     return 1; 
    } 
    auto xch = static_cast<volatile Exchange*>(
        mmap(0, sizeof(Exchange), 
         PROT_READ | PROT_WRITE, MAP_SHARED, 
         fd, 0)); 
    if(!xch) 
    { 
     std::cerr << "no mapping\n"; 
     return 1; 
    } 
    xch->x=23; 
    while(1) 
    { 
     // Do I need to insert some sync instruction here? 
     std::cout << xch->x << std::endl; 
     xch->x++; 
     msync((void*)(xch), sizeof(*xch), MS_SYNC); 
     sleep(1); 
    } 
} 

ответ

1

Как вы уже используете msync в сочетании с MS_SYNC не должно быть больше нет необходимости для дальнейшей синхронизации.

Основные части человек страницы:

msync() сбрасывает изменения, внесенные в копию внутриреакторного файла, который был отображается в память с помощью ММАП (2) обратно в файловую систему.


MS_SYNC: просит обновление и ждет его завершения.


для чтения, также не больше синхронизация не должно быть необходимости. Используя msync, данные записываются обратно в файл, что отмечает страницу файла «грязный», а при следующем считывании страницы файла снова считывается механизмом mmap (с обновленным значением).


ДАЛЕЕ INFO:

  • В вашем примере, может случиться так, что ММАП не может быть создан, если ваша карта не страница выровнен. В качестве размера или длины карты всегда используйте кратное количество страниц.

  • mmap for writing sequential log file for speed?