我想要一个简单的进程间障碍解决方案。这里有一个解决方案:解决方案
但是我完全迷失了 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
- 地图
- 另一个