2011-12-19 133 views
0

任何人都可以幫助寫一個在fortran的信號量函數嗎?我有多個進程正在運行,我必須使用信號同步它們。這樣的代碼可以找到C++等,但我找不到任何這樣的代碼爲fortran。fortran的信號量

如果我可以從fortran代碼調用C/C++函數,那也足夠了,因爲C++信號函數已經存在。

PS:(附加說明)以下是適用於C++的代碼。我有一些Fortran應用程序(作爲標準基準的一部分),但沒有信號代碼來同步它們。

int get_semaphore() 
    { 
    int sem_id; 
    sem_id = semget(SEM_ID, 1, IPC_CREAT | 0666); 
if (sem_id == -1) { 
    perror("get_semaphore: semget"); 
    exit(1); 
} 
return sem_id; 
} 


int set_semaphore (int sem_id, int val) 
    { 
    return semctl(sem_id, 0, SETVAL, val); 
    } 

void decrement_semaphore (int sem_id) 
{ 
struct sembuf sem_op; 
sem_op.sem_num = 0; 
sem_op.sem_op = -1; 
sem_op.sem_flg = 0; 
semop(sem_id, &sem_op, 1); 
} 

void wait_semaphore (int sem_id) 
{ 
struct sembuf sem_op; 
sem_op.sem_num = 0; 
sem_op.sem_op = 0; 
sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 
    } 

感謝您的幫助提前。

+0

我會建議你的問題更具體你想完成什麼。你有沒有嘗試過任何東西?你可以發佈代碼示例嗎?您可能需要查看Fortran的MPI:http://www.mcs.anl.gov/research/projects/mpi/ – milancurcic 2011-12-19 17:19:31

+0

@ IRO-bot我給出了一個C++代碼片段。我不能使用MPI,因爲它不是並行代碼:僅僅爲了同步,信號量是需要的。除此之外,沒有分享。 – user984260 2011-12-19 17:29:39

+0

好的,希望有人能夠參與進來,這不是我的領域:) – milancurcic 2011-12-19 17:45:51

回答

2

OpenMP在術語「鎖定」下提供信號量。由於OpenMP提供了更高級別的任務構造,因此通常不會使用這些構造,但如果您想自己做,則可以通過Fortran進行顯式鎖定/解鎖。

P.S.如果您想通過調用您已有的C代碼從Fortran來完成,可以通過使用Fortran 2003的ISO C綁定來完成。關於這是如何工作的,這裏有許多問題/答案。我爲您的Fortran程序起草了聲明以匹配C例程。這些告訴Fortran編譯器如何使用C編譯器的調用約定來調用C例程。這些是未經測試的,可能需要調試:

use iso_c_binding 

interface semaphore_stuff 

    function get_semaphore() bind (C, name="get_sempaphore") 
     import 
     integer (c_int) :: get_semaphore 
    end function get_semaphore() 

    function set_semaphore (sem_id, int val) bind (C, name="get_sempaphore") 
     import 
     integer (c_int) :: set_semaphore 
     integer (c_int), intent (in), value :: sem_id 
     integer (c_int), intent (in) value :: val 
    end function set_semaphore 

    subroutine decrement_semaphore (sem_id) bind (C, name="decrement_semaphore") 
     import 
     integer (c_int), intent (in), value :: sem_id 
    end subroutine decrement_semaphore 

    subroutine wait_semaphore (sem_id) bind (C, name="wait_semaphore") 
     import 
     integer (c_int), intent (in), value :: sem_id 
    end subroutine wait_semaphore 

end interface semaphore_stuff 
+0

我不清楚用戶如何在MPMD設置中使用它;你如何讓不同的程序就信號量達成一致?我想mmap一些碎片內存段,並在那裏鎖?但是這只是將問題轉移到你如何在Fortran上使用mmap ... – 2011-12-19 21:40:07