簡體   English   中英

C ++多線程優化

[英]c++ multithread optimization

在我的代碼中,我有2/4個線程執行蒙特卡洛模擬。 他們每個人都進行大量實驗,並將所有結果收集到stl向量中。 我的問題是:假設每個線程依次運行1000個實驗。 將結果一次存儲一次或偶爾存儲到共享向量中更好嗎? 如果他們等到數據量保持一致,則寫入向量將花費更長的時間,因此我不確定第二種解決方案是否一定比第一種更好。

PS每個實驗都是數值計算,因此沒有IO操作。

謝謝

如果要等到所有結果都計算好后再使用任何結果,請在向量中為4,000個結果預分配空間,並使每個線程寫入向量中的一個元素范圍。 不需要鎖定,因為沒有兩個線程訪問向量中的相同元素。

如果要在計算結果時使用結果,請使用某種並發隊列數據結構代替向量。

如果您僅在向量中放置2000到4000個元素,我懷疑這兩種方法是否會有很大的不同。

做該算法最自然的事情。 如果效果不佳,請嘗試以其他方式進行。

仔細考慮一下后,將每個線程的結果存儲到本地向量中,然后將本地向量的內容復制到“全局”向量(受鎖保護)中,可能會達到兩個目的(簡單性和速度)。線程完成。 當然,只要任何等待結果的東西都可以等到線程完全完成后再進行更新即可。

在這里,單鏈列表可能比矢量更好。

如果只有一個線程讀一個線程寫入一個fifo ..您不需要任何同步。 訣竅是始終將至少一個'dummy'元素始終保留在列表中,並且如果head == tail,則fifo為空。 可以操縱頭和尾指針進行推入和彈出操作,因此不需要同步。

使用此..您可以使多個Q.不需要任何同步。如果new / delete花費時間..您可以讓Q來保存可重用的元素。

祝你好運。

記住..一位讀者,一位作家..不多也不少。 訣竅是這樣創建大量的Q,Q也可以回收對象..並且您不需要任何線程同步的東西...

如果您的Q確實是空的..,則只需要一個sleep()/ wakeup()功能。

如果我還沒有說的話..恰好一位讀者,恰好一位作家。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM