2017-07-19 67 views
1

我想用不同的设置在不同的std::threads中运行Fortran90函数,该函数使用许多模块来存储设置和一些常规数据。我看到的问题是,Fortran模块就像单身对象。当我用两个线程调用函数时,它们在同一个模块上工作。有没有办法让模块threadprivate像openmp一样?在std :: thread中使用C++中的Fortran模块

例如使用OpenMP与线程专用数据的模块如下:

MODULE EXAMPLE 
    USE OMP_LIB 
    ! some threadprivate data: 
    INTEGER           :: VALUE = 0 
    ! make value threadprivate. 
    !$OMP THREADPRIVATE(VALUE) 
    CONTAINS 
END MODULE EXAMPLE 

我可以做的std::thread类似的东西?

+1

没有标准可以涵盖这个,但至少在某些ELF系统(最着名的是Linux)中,GNU OpenMP运行时和'std :: thread'都使用ELF TLS来存储线程局部变量。因此,OpenMP线程专用变量在C++线程中也是线程本地的。再一次,这既不标准也不便携。 –

+1

请注意,即使在Linux上,运行时间也不仅仅是GOMP。它们可能与此功能兼容,但它们通常不兼容。但是C++线程很可能在OpenMP线程的同一底层(例如POSIX线程)之上实现,这很自然。 –

回答

1

C++标准线程完全与Fortran不同。 在Fortran中没有什么可以做的,

你必须以一种其他方式存储数据的方式而不是全局(模块)变量来实现一切。

+0

谢谢你的回答。其实我是希望避免图书馆的复员。我猜可能没有其他办法。 – andrew28349

相关问题