Семафоры для Фортрана - PullRequest
       73

Семафоры для Фортрана

0 голосов
/ 19 декабря 2011

Может кто-нибудь помочь с написанием функции семафора на фортране? У меня запущено несколько процессов, и я должен синхронизировать их с помощью семафора. Такой код можно было найти для C ++ и т. Д., Но я не смог найти такой код для fortran.

Если бы я мог вызвать функцию C / C ++ из кода Fortran, этого также было бы достаточно, поскольку функция семафора 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 Ответ

2 голосов
/ 20 декабря 2011

OpenMP предоставляет семафоры под термином «блокировка».Обычно они не используются, поскольку OpenMP предоставляет конструкции задач более высокого уровня, но если вы хотите сделать это самостоятельно, это может быть способом сделать явную блокировку / разблокировку с помощью Fortran.

PS Если вы хотите это сделатьиз Фортрана, вызвав код C, который у вас уже есть, что можно сделать с помощью привязки ISO C в Fortran 2003. Здесь много вопросов / ответов о том, как это работает.Я разработал декларации для вашей программы на Фортране, чтобы они соответствовали процедурам Си.Они сообщают компилятору 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
...