【问题标题】:array pointers that don't change size. Do I need locks?不改变大小的数组指针。我需要锁吗?
【发布时间】:2023-03-07 01:58:02
【问题描述】:

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

因此,我现在有 8 个bitset<UINT64_MAX> 位集。我计划创建 8 个单独的线程,每个线程负责设置和检查它们拥有的 bitset,这是由传递给每个线程的索引定义的。

鉴于他们正在访问和修改同一个位集数组,我是否需要使用互斥锁?

这是我的代码示例:

#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);
   }
}

【问题讨论】:

  • stackoverflow.com/a/39014404/1043824 显然你必须使用一些同步机制。
  • @inquisitive 似乎是指从多个线程对单个 bitset 进行操作(不是一个好主意)。这里的问题是关于bitsets 的数组,其中一个bitset 分配给每个线程并且没有被任何其他线程操作(看不出有什么问题)。

标签: c++ concurrency mutex


【解决方案1】:

我需要使用互斥体吗?

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

【讨论】:

    【解决方案2】:

    鉴于他们正在访问和修改同一个位集数组,我是否需要使用互斥锁?

    没有;只要每个线程使用数组的单独元素,就不需要同步。

    但是,如果位集很小,由于从多个线程访问同一高速缓存行会导致“错误共享”,因此对该数组的访问可能会被有效地序列化。如果线程只花费少量时间访问数组,例如只在昂贵计算的最后写入,这将不是问题。

    bitset&lt;UINT64_MAX&gt; 虽然不小。其中 8 个位集总共是 16 个 Exa 字节。我希望你在采购硬件时能得到一笔好交易:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多