调整 std::vector<std::atomic_bool> 的大小,为所有原子布尔值分配 true

Resize a std::vector<std::atomic_bool> assigning true to all atomic bools

本文关键字:std 布尔值 分配 true atomic lt vector bool 调整 gt      更新时间:2023-10-16

i有一个我想调整到一些任意nstd::vector<std::atomic_bool>,其中所有新创建的对象都被分配为true的值。该程序不会构建,因为resize()依赖于数据类型的复制构造函数,而不是其分配运算符。是否有任何方法可以将默认值分配给atomic_bool,或者我会使用循环和store()的所有值?

我尝试了什么:

#include <atomic>
#include <vector>
class foo() {
public:
    std::vector<std::atomic_bool> vec;
    foo() {
        std::atomic_bool temp(true);
        vec.resize(100, std::atomic_bool(true)); //try 1
        vec.resize(100, temp); //try 2
    }
}

如果T既无法复制也不可移动,则无法调整std::vector<T>。时期。在这种情况下,您可能需要考虑std::deque

std::deque<std::atomic_bool> D;
D.emplace_back(true);  // write a helper to do this 100 times if you want

但是,请注意,原子质的标准库容器不是原子。将新元素添加到容器中不是原子操作,因此您可能必须使用MUTEX保护容器,这可能会消除内部存储原子的任何好处。

brian对deque的建议是合理的,但仍然允许o(1)随机访问,尽管我希望它比vector慢了几倍。Kerrek关于管理vector的更高级别的建议也可以可行。

fwiw,另一个选项是将单个std::atomic_bool s包裹起来,该类型将复制构造作为默认结构和分配的组合:

组合:
struct Copy_Constructible_Atomic_Bool : std::atomic_bool
{
    Copy_Constructible_Atomic_Bool(const std::atomic_bool& rhs)
    {
        std::atomic_bool::operator=(rhs);
    }
    Copy_Constructible_Atomic_Bool(const Copy_Constructible_Atomic_Bool& rhs)
    {
        std::atomic_bool::operator=(rhs);
    }
};

用法:

std::vector<Copy_Constructible_Atomic_Bool> vec;
std::atomic_bool temp;
temp = true;
vec.resize(100, temp);

原子不是被设计为移动的,因此您无法将它们重新分配到其他地方。但是,您可以替换它们。

vec = std::vector<std::atomic_bool>(100, true);

(我不是100%确定您可以在这里使用true,但我相信您可以。)