(1)什麼叫做"沒辦法跑"?(2)建議把平行區塊內的各個變數的屬性都標明。你的懷疑是合理的,請參考以下連結:
https://computing.llnl.gov/tutorials/openMP/#THREADPRIVATE再者,你這樣寫會導致不同的執行緒同時讀/寫/開/關同個檔案,遲早觸發race condition。喔看錯,可能會造成困擾的是(只)同時開/關同個檔案。又錯...同時讀也會造成問題。如果只是同時操作同一編號的不同名稱檔案,只需要改成各執行緒用不同的編號即可。如果是操作同一名稱的檔案,可以考慮為各執行緒創建不同名稱的副本(複製或連結),視需要最後再刪除或合併。也可以考慮每到操作檔案時限制只有一個執行緒可用。話說回來,除非你用的儲存裝置夠快,快到可以輕鬆負荷多個執行緒同時讀寫檔案,否則讀寫就效能來說沒有必要平行化,甚至可能會有反效果。你需要先了解變數的屬性有哪些以及各自的用途,然後再仔細審視程式碼、依照各個變數的需求賦予不同的屬性,譬如我上面給的連結就是在說明其中一種你的程式碼可能會需要用到的變數屬性。da01等變數並不是全域的,而且也不是從主程式傳遞至副程式,所以在主程式令其為PRIVATE是沒有意義的,只會多占用一點點記憶體。不同路徑就是不同檔案,除非你是同檔案連結到不同路徑.主程式的那些字串變數(ch29等)和副程式內同名的變數根本沒有關係所以不必給屬性,而其實在主程式中根本用不到所以甚至不需要宣告。副程式的那些字串就是另外一個世界了所以也不用動。common的變數如要私有化需要使用THREADPRIVATE屬性。max1與max2都是常數所以不需要也不可以給屬性。迴圈用的引數i當然要私有化所以是PRIVATE。inp19的其他變數(nn19~nm119)如果有需要私有化那就私有化,不過主程式乍看根本用不到這些變數所以乾脆連傳都不要傳了,直接省去就不用考慮要用哪種私有化的屬性,不然你就還是要視需求慎擇屬性。最後就是檔案編號,再加上i就可以簡單避免重複,或者加上執行緒的編號也可以。