2

我想要一个简单的进程间障碍解决方案。这里有一个解决方案:解决方案

但是我完全迷失了 mmap ......第一次尝试时,它失败了十分之一(段错误或死锁)。

我知道我的问题来自同步问题,但我找不到它。我找到了一个设置 mmaped 内存的示例(example),但我不确定它是否适用于 mmaped pthread_barrier。

这是我的代码的摘录:

#define MMAP_FILE "/tmp/mmapped_bigdft.bin"

void init_barrier() {
  pthread_barrier_t *shared_mem_barrier;
  pthread_barrierattr_t barattr;
  pthread_barrierattr_setpshared(&barattr, PTHREAD_PROCESS_SHARED);

  hbcast_fd = open(MMAP_FILE, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
  result = lseek(hbcast_fd, sizeof(pthread_barrier_t)-1, SEEK_SET);
  result = write(hbcast_fd, "", 1);
  shared_mem_barrier = (pthread_barrier_t*) mmap(0, sizeof(pthread_barrier_t), PROT_READ | PROT_WRITE, MAP_SHARED, hbcast_fd, 0);
  if (mpi_rank == 0) {
    int err = pthread_barrier_init(shared_mem_barrier, &barattr, host_size);
  }
  MPI_Barrier(some_communicator);
}

问题:

  • 我错过了 mmap 初始化中的某些内容吗?
  • 哪些操作应该由所有进程执行,哪些应该只由一个进程执行?

新问题

管理 pthread 屏障哪个更安全?还是它们基于相同的机制?

  • shmget
  • shm_open
  • 地图
  • 另一个
4

3 回答 3

2

正如查尔斯所提到的,看起来截断是什么让你。此外,您应该使用 pthread_barrierattr_init 初始化属性。

至于另一个问题,只有一个进程应该进行初始化,然后所有进程都应该调用 pthread_barrier_wait (就像使用 MPI 一样)。

我看到了你的另一个问题,所以我知道你为什么不想使用 MPI。因此,您可能只需要一个 MPI 屏障来初始化您的 pthread 屏障,如下所示:

if (rank == 0)
{
  /* Create the shared memory segment, initialise the barrier. */
}
MPI_Barrier(communicator);
if (rank != 0)
{
  /* Load the shared memory segment, cast it to a pthread_barrier_t* and store.
   * It's already initialised */
}
于 2010-12-20T13:32:33.960 回答
1

您不想为每个进程都使用 O_TRUNC 打开文件。每次执行此操作时,您都会再次截断文件,并可能使您之前执行的 mmap 操作无效(更改文件大小时对以前 mmap 的影响通常是未定义的)。

除此之外,我认为您不能在 mmap 内存中拥有信号量并使其正常运行(它可能在某些操作系统平台上,所以我怀疑它通常能保证按您想要的方式运行)。

您真正想要使用的是共享内存。在“shmget”和“shmat”上学习如何创建和映射共享内存。您可能仍然需要一个文件来传递共享内存 ID,并且您应该小心在应用程序崩溃期间通过注册信号处理程序来释放共享内存 ID。否则,您可能会留下僵尸共享内存分配并超出您的操作系统资源限制。如果您尝试在主线程上创建共享内存段时获得 ENOSPC,您就会知道发生了这种情况。

于 2010-12-20T13:09:56.240 回答
1

您应该使用shm_open来创建共享段。

  • 使用参数O_CREAT,您应该能够检测一个进程是否是第一个创建段的进程。
  • 只有那个进程应该将段截断到适当的长度,映射它并初始化屏障。
  • 所有检测到他们不是第一个的其他人都应该睡一会儿,一秒钟左右就足够了,然后映射该段。
  • 之后,所有进程都可以同步屏障。
于 2010-12-20T14:39:30.760 回答