2010-12-20 28 views
2

我想要一个跨进程障碍的简单解决方案。这里的一个解决方案:solution进程间共享内存和pthread_barrier:如何安全?

但是我完全失去了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初始化的东西吗?
  • 哪个操作应该由所有进程执行,哪个操作应该只有一个?

新问题

这是一种用于管理并行线程屏障safier?或者它们是基于相同的机制?

  • shmget的
  • 的shm_open
  • MMAP
  • 另一个

回答

1

你不想打开与O_TRUNC文件每个进程。每次你这样做时,你都会再次截断文件,并可能使你之前执行的mmap操作无效(当改变文件大小时通常未定义对先前mmap的影响)。除此之外,我不认为你可以在mmap的内存中有一个信号量,并且它的功能正确(它可能在某些操作系统平台上,所以我怀疑它通常保证以你想要的方式运行)。

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

+1

你有指针解释所有这一切吗?你说mmap不是pthread_barrier的最佳选择。 shmget比较好?你有另外一个想法吗? – 2010-12-20 13:52:31

2

正如Charles所提到的,它看起来像截断是什么让你。另外,您应该使用pthread_barrierattr_init来初始化属性。

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

我看到了你的其他问题,所以我知道你为什么不想使用MPI。所以,你可能做的只是一个单一的MPI障碍初始化您的并行线程的障碍,就像这样:

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 */ 
} 
+0

你会使用哪种共享内存方法? – 2010-12-20 13:39:59

+0

上次我需要执行进程间隔时,我使用了MPI;)POSIX共享内存应该没问题,这就是您已经使用的内存。您只需在其正确初始化之前停止其他进程访问共享内存。 – axw 2010-12-20 13:45:15

+0

我的问题是关于哪个共享内存范例应该用于pthread_barrier:mmap,shmget,另一个? – 2010-12-20 13:53:12

1

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

  • 随着paramenter O_CREAT你 应该能够检测一个过程 是第一个创建的段。
  • 只有该过程应该将 分段修剪为合适的长度,将其映射到 并初始化障碍。
  • 所有其他检测到他们 不是第一个应睡眠 ,而第二个左右应该足够,然后映射该段。
  • 之后所有进程可能会同步 障碍。
相关问题