Home > Mobile >  initialisation of atomic init
initialisation of atomic init

Time:12-31

So in my code there is the snippet:

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));
}

However, on execution, the error returned is:

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

Any one had a similar issue?

Cheers.

CodePudding user response:

In your code it appears that you're trying to create std::atomic<uint> objects out of "raw memory". If that's the case then you need to use placement new to begin the lifetime of such an object before using it. Also, &atomic_buffer[i] can be spelled atomic_buffer i. So your code should be:

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

The std::atomic_init function should only be used on default-constructed std::atomic<T> objects, and is completely unnecessary as of C 20. (Even if you don't have C 20 yet, you can already stop using std::atomic_init. Just remember to always give std::atomic<T> objects an explicit value upon construction. This will ensure that your code won't change behaviour in C 20.)

  • Related