저는 인터 프로세스 장벽에 대한 간단한 솔루션을 원했습니다. 여기에 솔루션 : solution프로세스가 공유 메모리를 처리하고 pthread_barrier가 어떻게 안전합니까?
하지만 나는 완전히 mmap과 함께 잃어버린 ... 내 첫 번째 시도와 함께, 그것은 10 번 (segfault 또는 교착 상태) 중 하나가 실패합니다.
내 문제는 동기화 문제에서 비롯된 것으로 알고 있지만 찾을 수 없습니다. 나는 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 장벽을 관리하기위한 safier 뉴 질문
? 아니면 같은 메커니즘을 기반으로합니까?
- 하는 shmget
- shm_open
- mmap에
- 다른
이 모든 것을 설명하는 포인터가 있습니까? 당신은 mmap이 pthread_barrier를위한 최선이 아니라고했습니다. shmget는 더 낫다? 다른 점이 있습니까? –