调整std :: vector <std :: atomic_bool>的大小,为所有原子bool赋值true

时间:2016-06-16 23:01:11

标签: c++ vector atomic

我有一个std::vector<std::atomic_bool>,我希望将其调整为一些任意n,其中所有新创建的对象都被赋值为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
    }
}

3 个答案:

答案 0 :(得分:7)

如果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

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

答案 1 :(得分:0)

Brian建议deque是合理的,并且仍允许O(1)随机访问,但我预计它会比vector慢几倍。 Kerrek建议管理vector的更高级别课程也是可行的。

FWIW,另一个选择是使用一种类型包装单个std::atomic_bool,该类型将复制构造编排为默认构造和赋值的组合:

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

答案 2 :(得分:-2)

atomics不是为了移动而设计的,所以你不能将它们重新分配到其他地方。但是,您可以替换它们。

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

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