標題是這樣的問題:當一個線程退出,確實它的緩存內存就臉紅到主存儲器?線程的緩存在退出時是否會刷新到主內存?
我在想,因爲在主線程創建一些線程的情況下,他們在數組的獨立部分做了一些工作(彼此之間沒有數據依賴關係),主線程加入所有工作線程,然後執行更多使用由工作線程計算得到的數組值進行計算。是否需要爲主線程聲明volatile
以查看其副作用?
標題是這樣的問題:當一個線程退出,確實它的緩存內存就臉紅到主存儲器?線程的緩存在退出時是否會刷新到主內存?
我在想,因爲在主線程創建一些線程的情況下,他們在數組的獨立部分做了一些工作(彼此之間沒有數據依賴關係),主線程加入所有工作線程,然後執行更多使用由工作線程計算得到的數組值進行計算。是否需要爲主線程聲明volatile
以查看其副作用?
的並行線程規範要求pthread_join()
是的函數"synchronizes memory with respect to other threads"之一,因此在並行線程的情況下,你都OK - pthread_join()
返回後,主線程會看到所有的更新通過加入線程所做共享內存。
假設你用C這樣做,如果數組是全球性的,或者您已經傳遞到包含在該線程需要做的計算和指向數組的索引線程,結構則由於數組內存在工作線程和主線程之間共享,因此數組不需要是易變的,以便主線程查看更改。
「因爲該存儲器的工作線程和主線程之間共享的」適用於單變量情況下,同樣,但它需要_does_揮發性。爲什麼不是一個數組? – user3286380
通過使用volatile,您指示編譯器不要對該變量進行任何優化,因爲其他硬件或線程可能會更改該值。在這裏,有人提到線程可以在數組的獨立部分工作。例如,如果你的數組被索引爲1-100,並且你有10個線程執行1-10,11-20 ... 91 -100,那麼這些線程將不會相互影響。它會工作得很好(只要數組的分佈是正確的)。我不明白爲什麼要在這種情況下通過使用volatile來阻止編譯器優化?你能詳細說明一下嗎? –
@knuckle_ball:你將_volatile_和_atomic_混合在一起。下面的問題是關於C++,但相同的是真正的C. http://stackoverflow.com/questions/8819095/concurrency-atomic-and-volatile-in-c11-memory-model – nosid
哪種編程您使用的語言?請注意,行爲通常由編程語言定義,而與操作系統和硬件體系結構無關。 – nosid
@nosid我使用的並行線程和C – user3286380
的CPU內存通常沒有線程的概念 - 如果它被寫入緩存,它會被刷新到較低的三級緩存和主內存最終,除非拆機過程或某物類似的排序會首先使這些緩存行無效。 – twalberg