Pthread Wrapper для Fortran

Я новичок в Fortran и C ++, работаю над задачей соединить две программы, написанные на Fortran и C ++.

Я пытаюсь создать pthread (обособленную) оболочку, вызвать ее из моей подпрограммы Fortran и передать ей функцию cpp. Я написал код по этой ссылке Вызов подпрограммы на Фортране без блокировки основной программы.

Я получаю ошибку во время выполнения, как показано ниже, когда я ее выполняю.

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:

Я скомпилировал с помощью следующих команд

gfortran-mp-4.7 -c pthread_mod.f90
g++-mp-4.7 -c -std=c++11 pcmodel.cpp
gfortran-mp-4.7 -c  mainFort.F
gfortran-mp-4.7 pthreads_module.o pcmodel.o mainFort.o -o test -lstdc++

Вот минимальный код, где я могу воспроизвести ошибку.

Pthreads_interface.h

extern "C" void pthread_create_opaque(pthread_t *threadptr, void *(**procptr)(void *), int *comerr){
//   creates a new thread using an opaque pointer to the pthread_t structure
pthread_attr_t  attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
*comerr = pthread_create(threadptr, &attr, (*procptr), NULL);
}

pthreads_module.f90

module pthreads_module
implicit none
interface

subroutine pthread_create_opaque (threadptr, procptr, comerr) bind(C,name="pthread_create_opaque")
USE ISO_C_BINDING
type(c_ptr) :: threadptr
type(c_funptr),value :: procptr
integer(c_int),intent(out) :: comerr
end subroutine

subroutine PCModel () bind (c,name="PCModel_")
USE ISO_C_BINDING
end subroutine PCModel

end interface
end module pthreads_module

mainFort.F

program test
call BCL00
end program test

SUBROUTINE BCL00
use pthreads_module
USE ISO_C_BINDING
implicit none
type(c_ptr) :: threadptr
integer :: comerr
call pthread_create_opaque(threadptr,
&          c_funloc(PCModel),comerr)

END

где PCModelявляется функцией C ++, выполняемой pthread.

pcmodel.cpp

 #include <iostream>
#include "pthreads_interface.h"using namespace std;

void PCModel(){
cout<<"PCModel is called"<<endl;
}

extern "C" void PCModel_(){
PCModel();
}

В идеале и мой код на Fortran, и на C ++ должны выполняться параллельно, как только код на Fortran запускает поток для запуска функции C ++ (PCModel)

Было бы здорово, если бы кто-нибудь мог проверить код и помочь мне.

2

Решение

В Pthreads_interface.h я изменил способ procptr передается от (*procptr) в procptr

extern "C" void pthread_create_opaque(pthread_t *threadptr, void *(*procptr)(void *), int *comerr){
//   creates a new thread using an opaque pointer to the pthread_t structure
pthread_attr_t  attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
*comerr = pthread_create(threadptr, &attr, procptr, NULL);
}

Теперь он работает без Segmentation fault и основная программа продолжается без ожидания потока.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]