Это тривиально в системе UNIX;просто используйте функции совместно используемой памяти:
shgmet, shmat, shmctl, shmdt
void * shmat (int shmid, const void * shmaddr, int shmflg);
shmat () присоединяет сегмент общей памяти, идентифицируемый shmid, к адресному пространству вызывающего процесса.Адрес подключения указывается с помощью shmaddr с одним из следующих критериев:
Если shmaddr равен NULL, система выбирает подходящий (неиспользуемый) адрес для присоединения сегмента.
Просто укажите свой адрес здесь;Например, 0x20000000000
Если вы используете shmget (), используя один и тот же ключ и размер в каждом процессе, вы получите один и тот же сегмент совместно используемой памяти.Если вы используете shmat () по одному и тому же адресу, виртуальные адреса будут одинаковыми во всех процессах.Ядро не заботится о том, какой диапазон адресов вы используете, если оно не конфликтует с тем, где оно обычно назначает объекты.(Если вы пропустите адрес, вы увидите общую область, в которую он любит помещать вещи; также проверьте адреса в стеке и вернулся из malloc () / new [].)
В Linux сделайтеУбедитесь, что root устанавливает SHMMAX в / proc / sys / kernel / shmmax на достаточно большое число, чтобы вместить ваши сегменты общей памяти (по умолчанию 32 МБ).
Что касается атомарных операций, вы можете получить их все из ядра Linuxисточник, например
include / asm-x86 / atomic_64.h
/*
* Make sure gcc doesn't try to be clever and move things around
* on us. We need to use _exactly_ the address the user gave us,
* not some alias that contains the same information.
*/
typedef struct {
int counter;
} atomic_t;
/**
* atomic_read - read atomic variable
* @v: pointer of type atomic_t
*
* Atomically reads the value of @v.
*/
#define atomic_read(v) ((v)->counter)
/**
* atomic_set - set atomic variable
* @v: pointer of type atomic_t
* @i: required value
*
* Atomically sets the value of @v to @i.
*/
#define atomic_set(v, i) (((v)->counter) = (i))
/**
* atomic_add - add integer to atomic variable
* @i: integer value to add
* @v: pointer of type atomic_t
*
* Atomically adds @i to @v.
*/
static inline void atomic_add(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "addl %1,%0"
: "=m" (v->counter)
: "ir" (i), "m" (v->counter));
}
64-разрядная версия:
typedef struct {
long counter;
} atomic64_t;
/**
* atomic64_add - add integer to atomic64 variable
* @i: integer value to add
* @v: pointer to type atomic64_t
*
* Atomically adds @i to @v.
*/
static inline void atomic64_add(long i, atomic64_t *v)
{
asm volatile(LOCK_PREFIX "addq %1,%0"
: "=m" (v->counter)
: "er" (i), "m" (v->counter));
}