不更改大小的数组指针。我需要锁吗?
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 字节。我希望您在采购硬件时得到很好的交易:)
相关文章:
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空