调整 std::vector<std::atomic_bool> 的大小,将 true 分配给所有原子 bool
Resize a std::vector<std::atomic_bool> assigning true to all atomic bools
我有一个 std::vector<std::atomic_bool>
,我想将其大小调整为任意 n
,其中所有新创建的对象都被分配了一个 true 值。该程序不会生成,因为 resize()
依赖于数据类型的复制构造函数,而不是其赋值运算符。有什么方法可以为 atomic_bool
分配默认值,或者我会坚持使用循环并 store()
ing 所有值吗?
我尝试过的:
#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
}
}
原子不是为移动而设计的,因此您不能将它们重新分配到其他地方。但是,您可以替换它们。
vec = std::vector<std::atomic_bool>(100, true);
(我不是 100% 确定你可以在这里使用 true
,但我相信你可以。)
如果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
但是,请注意原子的标准库容器不是原子的;向容器添加新元素不是原子操作,因此您可能必须使用互斥体保护容器,这可能会消除在内部存储原子的任何好处。
Brian 关于 deque
的建议是合理的,并且仍然允许 O(1) 随机访问,尽管我预计它会比 vector
慢几倍。 Kerrek 关于更高级别 class 管理 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);
我有一个 std::vector<std::atomic_bool>
,我想将其大小调整为任意 n
,其中所有新创建的对象都被分配了一个 true 值。该程序不会生成,因为 resize()
依赖于数据类型的复制构造函数,而不是其赋值运算符。有什么方法可以为 atomic_bool
分配默认值,或者我会坚持使用循环并 store()
ing 所有值吗?
我尝试过的:
#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
}
}
原子不是为移动而设计的,因此您不能将它们重新分配到其他地方。但是,您可以替换它们。
vec = std::vector<std::atomic_bool>(100, true);
(我不是 100% 确定你可以在这里使用 true
,但我相信你可以。)
如果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
但是,请注意原子的标准库容器不是原子的;向容器添加新元素不是原子操作,因此您可能必须使用互斥体保护容器,这可能会消除在内部存储原子的任何好处。
Brian 关于 deque
的建议是合理的,并且仍然允许 O(1) 随机访问,尽管我预计它会比 vector
慢几倍。 Kerrek 关于更高级别 class 管理 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);