Pthread包装器的Fortran



我是Fortran和C 的新手,致力于为fortran和c 编写的两个程序做一个任务。

我正在尝试创建一个Pthread(分离的(包装器,并将其从我的Fortran子例程中调用,然后将CPP函数传递给它。我通过遵循此链接来编写一些代码,而在不阻止主程序的情况下调用fortran中的子例程。

执行时,我会在下面遇到运行时间错误。

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是PTHread执行的C 函数。

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(

如果有人可以检查代码并帮助我,那就太好了。

在pthreads_interface.h我更改了从 (*procptr)传递的方式到 CC_4到 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的情况下运行,主程序继续不等待线程。

相关内容

  • 没有找到相关文章

最新更新