Fortran信号量为fortran

时间:2011-12-19 17:03:42

标签: fortran semaphore shared-memory

有人可以帮助在fortran中编写信号量函数吗?我有多个进程在运行,我必须使用信号量同步它们。这样的代码可以在C ++等中找到,但我找不到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);
  } 

感谢您的帮助。

1 个答案:

答案 0 :(得分: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