atomic init 的初始化

initialisation of atomic init

所以在我的代码中有片段:

std::atomic<uint>* atomic_buffer       = reinterpret_cast<std::atomic<uint>*>(data);
const size_t       num_atomic_elements = svm_data_size / sizeof(std::atomic<uint>);

for (i = 0; i < num_atomic_elements; i++)
{
    std::atomic_init(&atomic_buffer[i], std::atomic<uint>(0));
}

然而,在执行时,返回的错误是:

error: no matching function for call to 'atomic_init'
...
note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned int' vs. 'int')
atomic_init(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT

有人遇到过类似的问题吗?

干杯。

在您的代码中,您似乎正试图从“原始内存”中创建 std::atomic<uint> 对象。如果是这种情况,那么您需要使用 placement new 来开始此类对象的生命周期,然后再使用它。此外,&atomic_buffer[i] 可以拼写为 atomic_buffer + i。所以你的代码应该是:

new (atomic_buffer + i) std::atomic<uint>(0);

std::atomic_init 函数只能用于默认构造的 std::atomic<T> 对象,从 C++20 开始完全不需要。 (即使您还没有 C++20,您也可以停止使用 std::atomic_init。请记住在构造时始终给 std::atomic<T> 对象一个明确的值。这将确保您的代码不会不改变 C++20 中的行为。)