Например,Что означает назначение для атома C11?
atomic_int test(void)
{
atomic_int tmp = ATOMIC_VAR_INIT(14);
tmp = 47; // Looks like atomic_store
atomic_int mc; // Probably just uninitialised data
memcpy(&mc,&tmp,sizeof(mc)); // Probably equivalent to a copy
tmp = mc + 4; // Arithmetic
return tmp; // A copy - perhaps load then store
}
Clang доволен всем этим. Я прочитал раздел 7.17 стандарта, и он много говорит о модели памяти и определенных функциях (init, store, load etc), но ничего не говорит о обычных операциях (+, = и т. Д.).
Также представляет интерес поведение пропускающих struct wot { atomic_int value; }
функций.
Я хотел бы верить, что назначение ведет себя одинаково с атомной нагрузкой, а затем сохраняет с помощью memory_order_seq_cst.
Еще более оптимистично, я хотел бы верить, что назначение структуры, переход к функции, возврат из функции и даже memcpy также ведет себя одинаково, чтобы аккуратно копировать битовый шаблон через memory_order_seq_cst.
Я не могу найти никаких подтверждающих доказательств для любой веры в стандарт. Определенно существует вероятность того, что назначение и memcpy атомных примитивов - это неопределенное поведение.
Как должны вести себя примитивные операции над атомными примитивами?
Спасибо!
Спасибо! Является ли memcpy определенным для _Atomic типов, если выполняются обычные ограничения размера и выравнивания? В приведенном выше примере была memcpy между двумя _Atomic int, которые будут такого же размера, как и другие, но я также склонен к memcpy в и из выровненных массивов символов в качестве метода инкапсуляции, который мне бы грустно отказываться от _Атомных полей внутри структуры. –
Нет, доступ к '_Atomic' действителен только в том случае, если он проходит через операторы или функции. Очевидно, что если вы делаете «memcpy», не может быть никакой гарантии атомарности. –
Спасибо. Я думаю, что смогу с этим справиться. –