我想用不同的设置在不同的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
类似的东西?
没有标准可以涵盖这个,但至少在某些ELF系统(最着名的是Linux)中,GNU OpenMP运行时和'std :: thread'都使用ELF TLS来存储线程局部变量。因此,OpenMP线程专用变量在C++线程中也是线程本地的。再一次,这既不标准也不便携。 –
请注意,即使在Linux上,运行时间也不仅仅是GOMP。它们可能与此功能兼容,但它们通常不兼容。但是C++线程很可能在OpenMP线程的同一底层(例如POSIX线程)之上实现,这很自然。 –