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