我想要一個跨進程障礙的簡單解決方案。這裏的一個解決方案: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
- 另一個
你有指針解釋所有這一切嗎?你說mmap不是pthread_barrier的最佳選擇。 shmget比較好?你有另外一個想法嗎? – 2010-12-20 13:52:31