代码之家  ›  专栏  ›  技术社区  ›  Terence Chow

不改变大小的数组指针。我需要锁吗?

  •  0
  • Terence Chow  · 技术社区  · 7 年前

    我正在使用线程来提高程序的速度。

    因此,我现在有一个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);
       }
    }
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Remy Lebeau    7 年前

    我需要使用互斥锁吗?

    否,因为阵列是在创建线程之前预先分配的,并且不会更改大小,并且每个线程都独立地访问阵列的不同元素,因此不存在需要保护的任何数据的重叠或共享,以防止跨线程边界的并发访问。

        2
  •  1
  •   eerorika    7 年前

    考虑到它们正在访问和修改相同的位集数组,我是否需要使用互斥体?

    不只要每个线程使用阵列的单独元素,就不需要同步。

    bitset<UINT64_MAX> 但它并不小。其中8个位集总共为16 Exa字节。我希望你在采购硬件时能得到一笔好交易:)