Мне нужно обменять некоторые переменные в разных процессах и попробовать это через общую память. Следующий код является упрощенной версией этой попытки. Программа работает так, как ожидалось, но я хочу убедиться, что обмен не только работает из-за удачи.Каков правильный способ синхронизации доступа в 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);
}
}