fortran的信号量
任何人都可以帮助写一个在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);
}
感谢您的帮助提前。
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
我不清楚用户如何在MPMD设置中使用它;你如何让不同的程序就信号量达成一致?我想mmap一些碎片内存段,并在那里锁?但是这只是将问题转移到你如何在Fortran上使用mmap ... – 2011-12-19 21:40:07
我会建议你的问题更具体你想完成什么。你有没有尝试过任何东西?你可以发布代码示例吗?您可能需要查看Fortran的MPI:http://www.mcs.anl.gov/research/projects/mpi/ – milancurcic 2011-12-19 17:19:31
@ IRO-bot我给出了一个C++代码片段。我不能使用MPI,因为它不是并行代码:仅仅为了同步,信号量是需要的。除此之外,没有分享。 – user984260 2011-12-19 17:29:39
好的,希望有人能够参与进来,这不是我的领域:) – milancurcic 2011-12-19 17:45:51