2017-07-19 69 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

相關問題