Я хотел простое решение для межпроцессного барьера. Вот решение: решение
Но я полностью потерян с mmap ... С моей первой попытки, она терпит неудачу один из десяти раз (segfault или deadlock).
Я понимаю, что моя проблема связана с проблемой синхронизации, но я не могу ее найти. Я нашел пример для настройки памяти mmaped ( пример ), но я не уверен, что это хорошо для 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
- ММАП
- еще один