2011-12-19 96 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