Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fortran的信号量_Fortran_Semaphore_Shared Memory - Fatal编程技术网

fortran的信号量

fortran的信号量,fortran,semaphore,shared-memory,Fortran,Semaphore,Shared Memory,有人能帮助用fortran编写信号量函数吗?我有多个进程正在运行,我必须使用信号量来同步它们。这样的代码可以找到C++等,但我找不到任何这样的代码fortran。 如果我可以从FORTRAN代码调用C/C++函数,那么这也就足够了,因为C++信号量函数已经存在。 (附加解释):这里是C++的代码。我有一些fortran应用程序(作为标准基准测试的一部分),但没有信号量代码来同步它们 int get_semaphore () { int sem_id; sem_id = sem

有人能帮助用fortran编写信号量函数吗?我有多个进程正在运行,我必须使用信号量来同步它们。这样的代码可以找到C++等,但我找不到任何这样的代码fortran。

如果我可以从FORTRAN代码调用C/C++函数,那么这也就足够了,因为C++信号量函数已经存在。

(附加解释):这里是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);
  } 

提前感谢您的帮助。

OpenMP在术语“锁定”下提供信号量。通常不使用这些,因为OpenMP提供了更高级别的任务构造,但如果您想自己执行,这可能是使用Fortran执行显式锁定/解锁的一种方法

另外,如果你想从Fortran调用你已经有的C代码,那可以通过使用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

我建议在你的问题中更具体一些,你想完成什么。你已经试过什么了吗?你能发布一个代码示例吗?您可能想查看fortran的MPI:@ iRo BOT我已经给出了C++代码片段。我不能使用MPI,因为它不是并行代码:只是为了同步,需要信号量。除此之外,没有共享。好吧,希望有人会插手,这不是我的领域:)我还是不明白。您是如何在fortran中进行需要信号量的多线程处理的?没有原生的Fortran方式来访问这些低级的系统内容。@JonathanDursi我正在使用Marss进行多核仿真,每个核运行一个基准程序,即Fortran或C程序。为了在基准测试的关注区域建立一个检查点,我想使用信号量。对于C语言中的基准测试,我已经有了代码。只是为了福特兰,我需要一个。如果我能从Fortran中调用C函数,Fortran-C混合编程可以工作。不过,我不清楚用户会如何在MPMD设置中使用它;如何让不同的程序在信号量上达成一致?我猜mmap一些碎片内存段并在那里有一个锁?但这只是将问题转移到如何将mmap与fortran结合使用。。。