Атомарный доступ к общей памяти

У меня есть общая память между несколькими процессами, которая определенным образом интерполирует память. Пример:

DataBlock {
int counter;
double value1;
double ...    }

Я хочу, чтобы счетчик обновлялся / увеличивался атомарно. И для освобождения памяти по этому адресу. Если бы я, например, не использовал разделяемую память, это было бы что-то вроде

std::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release     operation on the affected memory location making the write visible to other threads

Как мне добиться этого для случайной ячейки памяти (интерпретируется как счетчик DataBlock> выше). Я могу гарантировать, что адрес выровнен в соответствии с требованиями архитектуры (x86 linux)

  1. Сделать обновление атомарным - как? (т.е. atomicupdate (addr, newvalue))
  2. Синхронизация памяти для многоядерных процессоров - (например, memorysync (addr)) - единственный способ, который я вижу, - это использование std :: atomic_thread_fence (std :: memory_order_release) - но это «установит память» порядок синхронизации ВСЕХ атомарных и расслабленных атомарных хранилищ »- это для меня перебор - я просто хочу, чтобы местоположение счетчика было синхронизировано. Цените любые мысли.
9
задан ildjarn 6 January 2012 в 14:37
поделиться