IPC через файл mmap: должны ли использоваться атомарные и / или летучие? - PullRequest
1 голос
/ 12 января 2011

Я использую файл mmap для обмена данными между процессами.

Код выглядит так:

struct Shared
{
int Data;
};

int file = open("file.dat", O_RDWR);
Shared* shared = static_cast<Shared*>(
    mmap(0, sizeof(Shared), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, file, 0));
shared->Data++;

Вопросы:

  1. Должен ли я использовать volatile квалификатор (volatile int Data)?
  2. Должен ли я использовать атомарные операции над общими данными (__sync_fetch_and_add(&(shared->Data), 1))?

Для дальнейшего использования: Volatile: практически бесполезен для многопоточного программирования .

Ответы [ 3 ]

1 голос
/ 12 января 2011

Вы не должны использовать volatile при изменении целого числа из более чем одного потока. Летучий не является необходимым и недостаточным. Атомные операции сделаем.

1 голос
/ 12 января 2011

Нет гарантии, что volatile будет работать правильно на нескольких процессорах, нужно проверить, вставляет ли встроенная память соответствующие барьеры памяти во время операции.

Это какой-то семафор?если так, то вам лучше использовать платформу для реализации такой конструкции.

0 голосов
/ 12 января 2011

Нет необходимости как в энергозависимом, так и в атомарном доступе.IPC, использующий mmap, прекрасно работает без них.

Если вам нужно сообщить, изменилось ли что-то, вы можете использовать очереди сообщений , но вы также можете использовать их вместо mmap (зависит от размерасообщение, которое вы хотите отправить. mmap работает хорошо, если данные большие, но MQ меньше 200k)

...