首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran和C++线程

Fortran和C++线程
EN

Stack Overflow用户
提问于 2015-02-26 08:09:52
回答 1查看 437关注 0票数 0

我有以下调用C++函数parallel_klu的Fortran代码。每次调用parallel_klu时,它都会创建八个线程(以执行另一个名为factor的函数),并在返回Fortran后销毁这些线程。

代码语言:javascript
复制
program linkFwithCPP        
   use iso_c_binding
   implicit none 
   interface
   subroutine my_routine (Ax, Ai, Ap, b, n, nz) bind (C, name = "parallel_klu")
   import :: c_double
   import :: c_int
   integer (c_int), intent (out), dimension (*) :: Ap
   integer (c_int), intent (out), dimension (*) :: Ai
   real (c_double), intent (out), dimension (*) :: Ax
   real (c_double), intent (out), dimension (*) :: b
   integer(c_int), value :: n
   integer(c_int), value :: nz
   end subroutine
   end interface


   integer,parameter ::n=10
   integer,parameter ::nz=34

   ! declare the 4 arrays
   real (c_double), dimension (0:nz-1) :: Ax
   real (c_double), dimension (0:n-1) :: b
   integer (c_int), dimension (0:n) :: Ap
   integer (c_int), dimension (0:nz-1) :: Ai
   !Inputing array values
    open(unit = 1, file = 'Ax.txt')
    read(1,*) Ax         
    close(1)

    open(unit = 2, file = 'Ai.txt')
    read(2,*) Ai            
    close(2)

    open(unit = 3, file = 'Ap.txt')
    read(3,*) Ap            
    close(3)

    open(unit = 4, file = 'b.txt')
    read(4,*) b            
    close(4)


    ! Call C++ function
    call my_routine(Ax, Ai, Ap, b, n, nz)
    write (*, *) "Fortran: b:", b
    pause
 end program linkFwithCPP  

C++中的函数如下:

代码语言:javascript
复制
 void parallel_klu(double Ax[], int Ai[], int Ap[], double b[], const int n, const int nz)
{
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 0, 5000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 5000, 10000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 10000, 15000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 15000, 20000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 20000, 25000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 25000, 30000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 30000, 35000));
  threadList.push_back(std::thread(factor, Ap, Ai, Ax, b, Q, P, Pinv, n, 35000, 40000));

// wait for all threads to finish
for (auto& threadID : threadList){
    threadID.join();
}

}

有没有办法避免每次调用函数parallel_klu时都创建8个线程?类似于在第一次调用时创建它们,然后发送一个信号让线程再次执行。

EN

回答 1

Stack Overflow用户

发布于 2015-02-26 20:55:06

首先,我强烈建议弄清楚线程创建是否会影响应用程序的性能。

如果是,您可以使用称为线程池的概念,线程池基本上是一组您可以向其发送任务的线程,它在无事可做时保持线程的构造/活动。这个概念也可以用来确定工作线程的数量。在this answer中提供了一些很好的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28732224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档