gpt4 book ai didi

c++11 - 以原子方式更新整数数组元素 C++

转载 作者:行者123 更新时间:2023-12-03 18:40:52 24 4
gpt4 key购买 nike

给定一个整数计数器的共享数组,我想知道一个线程是否可以在不锁定整个数组的情况下自动获取和添加数组元素?

这是使用互斥锁锁定对整个数组的访问的工作模型的说明。

// thread-shared class members
std::mutex count_array_mutex_;
std::vector<int> counter_array_( 100ish );

// Thread critical section
int counter_index = ... // unpredictable index
int current_count;
{
std::lock_guard<std::mutex> lock(count_array_mutex_);
current_count = counter_array_[counter_index] ++;
}
// ... do stuff using current_count.

我希望多个线程能够同时获取添加单独的数组元素。

到目前为止,在我对 std::atomic<int> 的研究中,我认为构建原子对象也构建了 protected 成员。 (还有很多答案解释了为什么你不能制作 std::vector<std::atomic<int> > )

最佳答案

单程:

// Create.
std::vector<std::atomic<int>> v(100);
// Initialize.
for(auto& e : v)
e.store(0, std::memory_order_relaxed);

// Atomically increment.
auto unpredictable_index = std::rand() % v.size();
int old = v[unpredictable_index].fetch_add(1, std::memory_order_relaxed);

请注意, std::atomic<> 复制构造函数被删除,因此向量无法调整大小,需要使用元素的最终计数进行初始化。

由于 std::vector 的调整大小功能丢失,因此您也可以使用 std::vector 代替 std::unique_ptr<std::atomic<int>[]> ,例如:
// Create.
unsigned const N = 100;
std::unique_ptr<std::atomic<int>[]> p(new std::atomic<int>[N]);
// Initialize.
for(unsigned i = 0; i < N; ++i)
p[i].store(0, std::memory_order_relaxed);

// Atomically increment.
auto unpredictable_index = std::rand() % N;
int old = p[unpredictable_index].fetch_add(1, std::memory_order_relaxed);

关于c++11 - 以原子方式更新整数数组元素 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54537594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com