2015-08-05 9 views
2

В чем разница между чтением значения atomic_uint с memory_order_relaxed и чтением значения volatile unsigned int (при условии, что изменчивые операции являются атомарными)?memory_order_relaxed load vs volatile load

В частности, давайте определим:

Решение 1

  1. "писатель" нить пишет на atomic_uint (с любым порядком памяти классификатором, от memory_order_relaxed до memory_order_seq_cst)
  2. «читатель «нить выполняет атомарную релаксацию на том же atomic_uint

Раствор 2

  1. «писатель» нить пишет в volatile unsigned int
  2. «читатель» поток считывает это значение

как есть, я знаю, что в обоих случаях не предлагают любые гарантии относительно способности читателя читать значение, написанное автором. То, что я пытаюсь понять, - это разница между изменчивым чтением и расслабленным атомным чтением. Что обеспечивает один другой, если учитывать согласованность после чтения?

Единственное различие, которое я вижу:

  • летучих операции не могут быть повторно упорядоченным между ними, в то время как атомная нагрузка может быть повторно заказана с другими атомарными операциями

Есть ли что-то еще ?

+0

Одним из них является неопределенное поведение (при отсутствии внешней синхронизации), а другое нет. –

ответ

1

Нестабильное считывание не гарантируется как атомное. Это означает, что вы можете прочитать значение, которое никогда не записывалось в переменную (а также никогда не могло быть написано ни одной частью вашей программы). Например. если ваше приложение только когда-либо записывает 0xAAAAAAAA или 0xBBBBBBBB в переменную, изменчивое чтение может давать 0xAAAABBBB. Или действительно что-то еще, поскольку в стандарте не указано поведение, когда волатильные чтения и записи появляются в разных потоках без других средств синхронизации.

Я не знаю, соответствует ли стандарт стандарту UB или реализации. Я могу только сказать, что существуют реализации (например, MSVC 2005), которые определяют поведение для несинхронизированных изменчивых операций чтения/записи в качестве расширения.

+0

Ах, да, я на самом деле указал atom_uint на мысль, что запись в unsigned int всегда будет атомарной, но, очевидно, это зависит от архитектуры. Спасибо за напоминание! :) Я больше интересуюсь гарантиями согласованности чтения и записи обоих подходов. Я отредактирую свой пост, чтобы это отразить. Благодаря! – kiv

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

  • Нет связанных вопросов^_^