Модель памяти TSO в x86 является последовательной последовательностью + буфер хранилища, поэтому только хранилищам seq-cst требуется специальное ограждение. (Остановка после хранилища до тех пор, пока буфер хранилища не опустеет, до последующей загрузки - это все, что нам нужно для восстановления последовательной согласованности). Более слабая модель acq / rel совместима с переупорядочением StoreLoad, вызванным буфером хранилища.
(См. Обсуждение в комментариях относительно того, является ли «разрешение переупорядочения StoreLoad» точным и достаточным описанием того, что позволяет x86. Ядро всегда видит свои собственные хранилища в программном порядке, поскольку загружает отслеживание буфера хранилища, так что вы можете сказать, что хранилище Переадресация также переупорядочивает загрузки недавно сохраненных данных. За исключением случаев, когда вы не всегда можете: Инструкции загрузки невидимого на глобальном уровне )
(И, кстати, компиляторы, отличные от gcc, используют xchg
для выполнения seq-cst store. На самом деле это более эффективно на современных процессорах. GCC mov
+ mfence
в прошлом могли быть дешевле, но в настоящее время обычно хуже, даже если вы не заботитесь о старое значение. См. Почему хранилище std :: atomic с последовательной последовательностью использует XCHG? для сравнения между GCC mov+mfence
и xchg
. Также мой ответ на Что лучше написать барьер на x86: lock + addl или xchgl? )
Интересный факт: вы можете добиться последовательной согласованности, вместо этого ограждая seq-cst , загружая вместо stor эс. Но для большинства случаев дешевые грузы гораздо ценнее, чем дешевые магазины, поэтому каждый использует ABI, где в магазинах есть полный барьер.
См. https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html для получения подробной информации о том, как атомарные операции C ++ 11 отображаются в последовательности команд asm для x86, PowerPC, ARMv7, ARMv8 и Itanium. Также Когда требуются инструкции x86 LFENCE, SFENCE и MFENCE?
, когда я использую std :: memory_order_release / acqu без оптимизации, также используется инструкция MFENCE
blockquote>Это потому, что
flag.store(true, std::memory_order_release);
не встроен, потому что вы отключили оптимизацию. Это включает в себя встраивание очень простых функций-членов, таких как `` atomic :: store (T, std :: memory_order = std :: memory_order_seq_cst) `Когда параметр упорядочения для встроенной функции
__atomic_store_n()
GCC равен переменная времени выполнения (в реализации библиотекиatomic::store()
), GCC воспроизводит ее консервативно и переводит ее в seq_cst. На самом деле это может стоить того, чтобы gcc разветвлялсяmfence
, потому что это так дорого, но это не то, что мы получаем.
Любое at-правило CSS, которое начинается с @ - moz-
, является правилом для конкретного движка Gecko, а не стандартным правилом. То есть это расширение, специфичное для Mozilla.
Правило url-prefix
применяет содержащиеся правила стиля к любой странице, URL-адрес которой начинается с него. При использовании без аргумента URL, такого как @ - moz-document url-prefix ()
, он применяется ко ВСЕМ страницам. По сути, это CSS-хак , используемый только для нацеливания на Gecko (Mozilla Firefox). Все остальные браузеры игнорируют стили.
См. здесь для получения списка других специфичных для Mozilla расширений.
@supports (-moz-appearance:none) {...} Работавший для меня в случаях, где - префикс URL moz-документа () {...} Не сделал.
Из https://developer.mozilla.org/en/CSS/@-moz-document
@-moz-document url(http://www.w3.org/),
url-prefix(http://www.w3.org/Style/),
domain(mozilla.org)
{
/* CSS rules here apply to:
+ The page "http://www.w3.org/".
+ Any page whose URL begins with "http://www.w3.org/Style/"
+ Any page whose URL's host is "mozilla.org" or ends with
".mozilla.org"
*/
/* make the above-mentioned pages really ugly */
body { color: purple; background: yellow; }
}