在 C++ 中使用双指针声明原子的动态数组是否正确?
Is it correct to declare a dynamic array of atomic using double pointers in C++?
我需要创建一个原子整数数组,即 n 个整数,每个整数都是原子的。我发现 std::vector<std::atomic<int>>
不起作用,但后来我尝试了以下方法并使用 clang 成功编译。
int n;
std::cin >> n;
std::atomic<int> **a;
a = new std::atomic<int>* [n];
for(int i = 0; i < n; i++)
{
a[i] = new std::atomic<int>();
}
我不确定这样做是否正确,是吗?另外,有没有什么方法可以验证这里的所有 a[i][0]
是否都是原子的(除了用多线程检查它)?
您的代码是正确的(除了资源泄漏,我假设为简洁起见省略了销毁数组),但很复杂。首先,为什么要使用 "double pointer" 或指向指针的指针?为什么不是这个:
std::atomic<int> * a1 = new std::atomic<int>[ n ];
如果这对你有用,那么
std::vector<std::atomic<int>> a2( n );
应该也可以,有一些不同,但最重要的可能是如果你按值传递 a1
,内容不会被复制,但如果你传递 a2
按价值计算,它们是。
这对您来说可能是个问题,因为 std::atomic
不可复制。所以你应该总是通过引用传递 a2
,除非你需要转移所有权;在这种情况下使用 std::move
和右值引用。您不能按值传递 a2
。
我需要创建一个原子整数数组,即 n 个整数,每个整数都是原子的。我发现 std::vector<std::atomic<int>>
不起作用,但后来我尝试了以下方法并使用 clang 成功编译。
int n;
std::cin >> n;
std::atomic<int> **a;
a = new std::atomic<int>* [n];
for(int i = 0; i < n; i++)
{
a[i] = new std::atomic<int>();
}
我不确定这样做是否正确,是吗?另外,有没有什么方法可以验证这里的所有 a[i][0]
是否都是原子的(除了用多线程检查它)?
您的代码是正确的(除了资源泄漏,我假设为简洁起见省略了销毁数组),但很复杂。首先,为什么要使用 "double pointer" 或指向指针的指针?为什么不是这个:
std::atomic<int> * a1 = new std::atomic<int>[ n ];
如果这对你有用,那么
std::vector<std::atomic<int>> a2( n );
应该也可以,有一些不同,但最重要的可能是如果你按值传递 a1
,内容不会被复制,但如果你传递 a2
按价值计算,它们是。
这对您来说可能是个问题,因为 std::atomic
不可复制。所以你应该总是通过引用传递 a2
,除非你需要转移所有权;在这种情况下使用 std::move
和右值引用。您不能按值传递 a2
。