2016-11-18 12 views
1

我需要创建一个原子整数的数组,即n个整数,每个整数都是原子的。我发现std::vector<std::atomic<int>>将无法​​正常工作,但后来我尝试了以下方法,并使用clang成功编译。在C++中使用双指针声明动态数组原子是正确的吗?

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]将在这里是原子(除了检查与多个线程)?

+3

'我发现std :: vector >不会工作。你尝试了什么? 'std :: vector > a(n);'非常有效。 –

+0

你是什么意思“检查是否所有'a [i] [0]'都是原子的”?他们的类型是'std :: atomic ',你还需要知道什么? –

+0

我试图在'std :: vector >'上调用'resize()',这就是导致问题的原因。但是,是的,它完美的工作,谢谢。 –

回答

1

你的代码是正确的(除了资源泄漏,我认为销毁数组已被忽略),但是很复杂。首先,为什么你使用“双指针”或指针指针?为什么不这样:

std::atomic<int> * a1 = new std::atomic<int>[ n ]; 

如果这对你的作品,然后

std::vector<std::atomic<int>> a2(n); 

应太,也有一些差别,但最重要的可能是,如果你按值传递a1,内容不会被复制,但是如果您按价值传递a2,它们是。

这可能是一个问题,因为std::atomic是不可复制的。所以你应该始终通过a2作为参考,除非你需要转让所有权;在这种情况下,使用std::move和右值引用。您无法通过值a2