【问题标题】:initialisation of atomic init原子初始化的初始化
【发布时间】:2021-12-30 18:29:37
【问题描述】:

所以在我的代码中有 sn-p:

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

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

干杯。

【问题讨论】:

  • data 是否真的拥有一组活动的atomic&lt;uint&gt; 对象?为什么不只使用placement-new
  • 你真的需要reinterpret_cast吗?你能以常规方式创建原子吗?
  • 如果std::atomic_init的第一个参数是std::atomic&lt;uint&gt;*,则第二个参数需要是uint
  • 什么是datadata 指向哪里?

标签: c++ atomic stdatomic


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2019-11-07
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多