考慮與Open MP以下情形:用不同線程共享數據的最快方法?
我們有一個指針A
指向內存中的一個非常大的緩衝區,我們有幾個線程,一個線程(可以稱之爲線#1)不斷更新的內容A
而其他線程根據#1控制的信號處理存儲在A
中的數據。
這是最快的方式,以確保(假設信號告訴其他線程合適的時間來複制A
是不可分割的,因此沒有競爭條件存在):
線程處理數據將始終使用udpated數據(例如沒有一些數據被緩存在寄存器等中的風險)。
性能良好。
考慮與Open MP以下情形:用不同線程共享數據的最快方法?
我們有一個指針A
指向內存中的一個非常大的緩衝區,我們有幾個線程,一個線程(可以稱之爲線#1)不斷更新的內容A
而其他線程根據#1控制的信號處理存儲在A
中的數據。
這是最快的方式,以確保(假設信號告訴其他線程合適的時間來複制A
是不可分割的,因此沒有競爭條件存在):
線程處理數據將始終使用udpated數據(例如沒有一些數據被緩存在寄存器等中的風險)。
性能良好。
您可以嘗試讀寫鎖定。線程#1保持寫入鎖定,其他線程保持讀取鎖定。這樣所有其他線程可以並行讀取,只有讀寫是互斥的。
這是否確保從其他線程的任何讀取將導致內存訪問,而不是嘗試在寄存器等中加載一些數據? – user0002128
閱讀鎖並不關心你實際做什麼讀操作。讀取操作可能是從內存,磁盤,網絡等讀取,具體取決於您的代碼。讀寫鎖只能確保讀操作可以並行,讀/寫是可變的獨佔。 – TieDad
嗯,問題是,有些情況下,線程2嘗試讀取內存中的某些數據(已更改),並且在編譯器優化後,編譯器認爲這些數據已經在寄存器中,因此沒有內存訪問,並且使用舊數據存儲在寄存器中,我試圖避免這種情況。 – user0002128
是否只有一個緩衝區?線程#1能夠排隊幾個更小的*緩衝區嗎? –