簡體   English   中英

不會更改大小的數組指針。 我需要鎖嗎?

[英]array pointers that don't change size. Do I need locks?

我正在使用線程來提高程序速度。

結果,我現在有一個8位的bitset<UINT64_MAX>集。 我計划創建8個獨立的線程,每個線程負責設置和檢查它們擁有的位集,這些位集由傳遞給每個線程的索引定義。

鑒於他們正在訪問和修改相同的位集數組,我是否需要使用互斥鎖?

這是我的代碼示例:

#define NUM_CORES 8
class MyBitsetClass {

public:
   bitset<UINT64_MAX> bitsets[NUM_CORES];
   thread threads[NUM_CORES];

   void init() {

       for (uint8_t i = 0; i < NUM_CORES; i++) {
           threads[i] = thread(&MyBitsetClass::thread_handler, this, i);
       }
       ... do other stuff
   }

   void thread_handler(uint8_t i){
       // 2 threads are never passed the same i value so they are always 
       // modifying their 'own' bitset. do I need a mutex?
       bitsets[i].set(some_index);
   }
}

我需要使用互斥鎖嗎?

否,因為在創建線程之前就已預先分配了數組,並且該數組不會更改大小,並且每個線程都獨立地訪問數組的不同元素,所以沒有任何重疊或共享需要保護並發的數據跨線程邊界訪問。

鑒於他們正在訪問和修改相同的位集數組,我是否需要使用互斥鎖?

沒有; 只要每個線程使用數組的單獨元素,就不需要同步。

但是,由於從多個線程訪問同一緩存行而導致的“錯誤共享”,如果位集很小,則可以有效地序列化對該數組的訪問。 如果線程僅花費少量時間訪問數組(例如僅在昂貴的計算的最后才寫),那么這將不是問題。

bitset<UINT64_MAX>雖然不小。 這些位集中的8位共16個Exa字節。 我希望您在采購硬件時能獲得很多收益:)

暫無
暫無

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

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