2010-12-20 79 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你 應該能夠檢測一個過程 是第一個創建的段。
  • 只有該過程應該將 分段修剪爲合適的長度,將其映射到 並初始化障礙。
  • 所有其他檢測到他們 不是第一個應睡眠 ,而第二個左右應該足夠,然後映射該段。
  • 之後所有進程可能會同步 障礙。
相關問題