将结构数组复制到共享内存中

Posted

技术标签:

【中文标题】将结构数组复制到共享内存中【英文标题】:Copying array of structs into shared memory 【发布时间】:2016-02-19 14:29:50 【问题描述】:

我有多个处理相同数据的进程。我想将数据保存在共享内存中。问题是我似乎无法保存(或检索)。

我的全部代码在这里: https://github.com/kasperekt/LLGame/blob/master/server_src/game_state.c#L74

但问题似乎出在这些函数内部:

typedef struct game_state 
  int resources;
  int wins;
  army_t *army;
 game_state_t;

...

static game_state_t *players[2] =  NULL, NULL ;
static game_state_t **mem_state = NULL;

...

void attach_state() 
  mem_state = get_memory_data(0);
  players[0] = mem_state[0];
  players[1] = mem_state[1];


void save_state() 
  if (mem_state == NULL) 
    mem_state = get_memory_data(0);
  

  mem_state[0] = players[0];
  mem_state[1] = players[1];
  detach_memory_data(mem_state);

以及适用于此数据的示例函数:

void increment_resources(int player_id) 
  attach_state();
  const int workers_count = players[player_id]->army->workers;
  players[player_id]->resources += RESOURCES_STEP + (workers_count * 5);
  save_state();

我应该如何将它保存到内存中?它是如何工作的?我找不到这个问题的答案。

也许这段代码也会有所帮助:

game_state_t **get_memory_data(char *shmaddr) 
  const int shmat_flag = 0;
  return shmat(memory_id, shmaddr, shmat_flag);


void detach_memory_data(game_state_t **data) 
  if (shmdt(data) == -1) 
    perror("Error detaching memory: ");
    exit(1);
  ;

【问题讨论】:

shmat 返回一个指向共享内存的指针,而不是指针的指针。 我认为您的代码中的主要问题是您正在考虑通过进程之间的共享内存来共享指针。您的 players 数组包含 2 个由单个进程分配的指针。那些mallocated 地址是虚拟化的。你不能在进程之间共享那些“价值”。 我会检查的。你给了我一个想法。谢谢 我还将在现代平台上使用 mmap 更改实现,而不是 System V 函数,用于共享内存。 【参考方案1】:

你有 game_state_t 变量。如果要存储多个状态,则只需要一维数组。这是示例。

game_state_t *memstate;
...
memstate = (game_state_t *) malloc( n * sizeof(game_state_t)); /* alloc memory for n states */

shmptr = shmat(...);

memcpy(shmptr, memstate, size);  /* size for example n * size of(game_state_t)); */

或者只使用共享内存。

memstate = shmat(...);

如 cmets 所示,结构的指针成员需要指向共享内存。

示例;

memstate.x = memstate + offset; /* use different offsets based on your usage */ 

【讨论】:

在概念上是正确的,但 game_state_t 结构有一个 army_t *army 成员。此地址不能在进程之间共享。 正确。我同意。谢谢。可以使用共享内存的某些部分。我认为我们在这里不需要堆分配。所有都可以存储在共享内存本身中。

以上是关于将结构数组复制到共享内存中的主要内容,如果未能解决你的问题,请参考以下文章

将数据从全局加载到共享内存时如何避免银行冲突

数组结构的 MPI-3 共享内存

多处理 - 具有多维 numpy 数组的共享内存

将数组作为共享内存,mmap函数要怎么写呢?

从共享内存存储和访问结构数组

将三个单独的数组放入共享内存