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 中的行为。)
所以在我的代码中有片段:
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 中的行为。)