2016-07-04 4 views
1

Например,Что означает назначение для атома 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 атомных примитивов - это неопределенное поведение.

Как должны вести себя примитивные операции над атомными примитивами?

Спасибо!

ответ

3

Операции над объектами, которые являются _Atomic квалифицированными (и atomic_int - это просто другое письмо для этого), гарантируют последовательную согласованность. Вы обнаружите, что упоминается в конце раздела семантики для каждого из операндов. (А может быть упоминание о присвоении отсутствует.)

Ваш код не является правильным в двух местах: инициализации должны использовать ATOMIC_VAR_INIT макросъемку (7.17.2.1), и memcpy не определено (размеры могут не согласиться), хотя он вероятно, будет работать на большинстве архитектур.

Также линия

tmp = mc + 4;    // Arithmetic 

не делать то, что ваш комментарий претензии. Это не арифметика на атомном объекте, а нагрузка, за которой следует обычное дополнение. Более интересным будет

mc += 4;    // Arithmetic 

, который является атомной операцией с последовательной согласованностью.

+0

Спасибо! Является ли memcpy определенным для _Atomic типов, если выполняются обычные ограничения размера и выравнивания? В приведенном выше примере была memcpy между двумя _Atomic int, которые будут такого же размера, как и другие, но я также склонен к memcpy в и из выровненных массивов символов в качестве метода инкапсуляции, который мне бы грустно отказываться от _Атомных полей внутри структуры. –

+0

Нет, доступ к '_Atomic' действителен только в том случае, если он проходит через операторы или функции. Очевидно, что если вы делаете «memcpy», не может быть никакой гарантии атомарности. –

+0

Спасибо. Я думаю, что смогу с этим справиться. –

Смежные вопросы