Как гарантировать, что 64-разрядные записи являются атомарными?

Вы можете легко вставить HTML как в заголовке, так и в теле:

var notification = new Notification('title',{body:'bold content'});

Но нет смысла: он не будет отображаться. В Firefox это будет выглядеть так:

Спектр говорит , что каждый из них является просто DOMString , а это означает, что это просто текст.

Если вы заботитесь только о поддержке Chrome, вы можете взглянуть на Rich Notifications . В противном случае, похоже, нам нужно подождать, пока некоторые средства не будут стилизовать уведомления на рабочем столе.

17
задан 3 revs, 3 users 100%vok 30 October 2009 в 02:42
поделиться

7 ответов

Согласно Главе 7 Часть 3A - Системное Руководство по программированию из Intel руководства процессора , quadword доступы будут выполнены атомарно, если выровнено на 64-разрядной границе на Pentium или более новые, и невыровненные (если все еще в строке кэша) на P6 или более новые. Необходимо использовать volatile, чтобы гарантировать, что компилятор не пытается кэшировать запись в переменной, и Вы, возможно, должны использовать стандартную программу забора памяти, чтобы гарантировать, что запись происходит в надлежащем порядке.

, Если необходимо основывать значение, записанное на существующем значении, необходимо использовать Взаимно блокируемые функции операционной системы (например, Windows имеет InterlockedIncrement64).

12
ответ дан 30 November 2019 в 09:59
поделиться

На x86_64 и компилятор Intel и gcc поддерживают некоторые внутренние функции атомарной операции. Вот документация gcc их: http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html

документы компилятора Intel также говорят о них здесь: http://softwarecommunity.intel.com/isn/downloads/softwareproducts/pdfs/347603.pdf (страница 164 или поблизости).

13
ответ дан 30 November 2019 в 09:59
поделиться

Ваш лучший выбор состоит в том, чтобы не пытаться создать Вашу собственную систему из примитивов и вместо этого использовать блокировку, если это действительно не обнаруживается как горячая точка при профилировании. (Если Вы думаете, что можно быть умными и избежать блокировок, сделать нет. Вы не. Это - генерал "Вы", который включает меня и всех других.) Вы должны в минимуме использовать спин-блокировку, видеть спин-блокировка (3) . И независимо от того, что Вы делаете, не делают попытка реализовать "Ваши собственные" блокировки. Вы поймете его превратно.

В конечном счете, необходимо использовать любую блокировку или атомарные операции, которые обеспечивает операционная система. Получение этих видов вещей точно правильный в [1 113] все случаи чрезвычайно трудно . Часто это может включить знание вещей как опечатки для определенных версий определенного процессора. ("О, версия 2.0 того процессора не сделала когерентности кэш-памяти, шпионящей в нужное время, это фиксируется в версии 2.0.1, но на 2,0 необходимо вставить NOP".) Просто удар volatile ключевое слово на переменной в C почти всегда недостаточно.

На Mac OS X, который означает, необходимо использовать функции, перечисленные в атомарный (3) для выполнения действительно atomic-across-all-CPUs операций на 32-разрядных, 64-разрядных, и количествах размера указателя. (Используйте последнего для любых атомарных операций на указателях, таким образом, Вы 32/64-bit совместимы автоматически.), Который идет, хотите ли Вы сделать вещи как атомарный, сравнивать-и-подкачивать, инкрементный/декрементный, блокировка вращения или управление стеком/очередью. К счастью, спин-блокировка (3) , атомарный (3) , и барьер (3) функции должны все работать правильно над всеми центральными процессорами, которые поддерживаются Mac OS X.

42
ответ дан 30 November 2019 в 09:59
поделиться

На Intel MacOSX можно использовать встроенную систему атомарные операции. Нет обеспеченного атомарного, получают или устанавливают для любой целые числа на 32 или 64 бита, но можно создать это из обеспеченного CompareAndSwap. Можно хотеть искать документацию XCode различные функции OSAtomic. Я записал 64-разрядную версию ниже. 32-разрядная версия может быть сделана со столь же именованными функциями.

#include <libkern/OSAtomic.h>
// bool OSAtomicCompareAndSwap64Barrier(int64_t oldValue, int64_t newValue, int64_t *theValue);

void AtomicSet(uint64_t *target, uint64_t new_value)
{
    while (true)
    {
        uint64_t old_value = *target;
        if (OSAtomicCompareAndSwap64Barrier(old_value, new_value, target)) return;
    }
}

uint64_t AtomicGet(uint64_t *target)
{
    while (true)
    {
        int64 value = *target;
        if (OSAtomicCompareAndSwap64Barrier(value, value, target)) return value;
    }
}

Примечание, что функции OSAtomicCompareAndSwap Apple атомарно выполняют операцию:

if (*theValue != oldValue) return false;
*theValue = newValue;
return true;

Мы используем это в примере выше для создания Метода установки первым захватом старого значения, затем пытаясь подкачать значение целевой памяти. Если подкачка успешно выполняется, который указывает, что значение памяти является все еще старым значением во время подкачки, и этому дают новое значение во время подкачки (который самой является атомарным), таким образом, мы сделаны. Если это не успешно выполняется, то некоторый другой поток вмешался путем изменения промежутка значения, когда мы захватили его и когда мы пытались сбросить его. Если это происходит, мы можем просто циклично выполниться и попробовать еще раз только с минимальным штрафом.

идея позади Получить метода состоит в том, что мы можем сначала захватить значение (который может или не может быть фактическим значением, если другой поток вмешивается). Мы можем затем попытаться подкачать значение с собой, просто проверить, что начальный захват был равен атомарному значению.

я не проверил это по своему компилятору, поэтому извините любые опечатки.

Вы упомянули OSX а именно, но в случае, если необходимо работать над другими платформами, Windows имеет, много Взаимно блокировались* функции, и можно искать документацию MSDN их. Некоторые из них работают над Windows 2000 Pro и позже, и некоторые (особенно некоторые 64-разрядные функции) являются новыми с Vista. На других платформах, версии GCC 4.1 и позже имеют разнообразие __ синхронизация* функции, такой как __ sync_fetch_and_add (). Для других систем Вы, возможно, должны использовать блок, и можно найти некоторые реализации в браузере SVN для проекта HaikuOS, внутри src/system/libroot/os/arch.

10
ответ дан 30 November 2019 в 09:59
поделиться

GCC имеет intrinsics для атомарных операций; я подозреваю, что можно сделать похожий с другими компиляторами, также. Никогда не полагайтесь на компилятор для атомарных операций; оптимизация почти наверняка рискнет превращать даже очевидно атомарные операции в неатомарные, если Вы явно не скажете компилятору не делать так.

1
ответ дан 30 November 2019 в 09:59
поделиться

Если Вы хотите сделать что-то вроде этого для межпотока или межпроцессного взаимодействия, то у Вас должны быть больше, чем просто атомарная гарантия чтения-записи. В Вашем примере кажется, что Вы хотите значения, записанные, чтобы указать, что некоторая работа происходит и/или была завершена. Необходимо будет сделать несколько вещей, не, все из которых являются портативными, чтобы гарантировать, что компилятор сделал вещи в порядке, Вы хотите их сделанный (энергозависимое ключевое слово может помочь до некоторой степени), и та память последовательна. Современные процессоры и кэши могут выполнить работу, не в порядке без ведома к компилятору, таким образом, Вам действительно нужна некоторая поддержка платформ (т.е., блокировки или определенные для платформы взаимно блокируемые API), чтобы сделать то, что кажется, что Вы хотите сделать.

"Забор памяти" или "барьер памяти" являются условиями, которые можно хотеть исследовать.

2
ответ дан 30 November 2019 в 09:59
поделиться

На X86 самый быстрый способ атомарной записи выровненного 64-битного значения - использовать FISTP. Для невыровненных значений вам необходимо использовать CAS2 (_InterlockedExchange64). Операция CAS2 выполняется довольно медленно из-за BUSLOCK, поэтому часто бывает быстрее проверить выравнивание и выполнить версию FISTP для выровненных адресов. Действительно, именно так Intel Threaded Building Blocks реализует атомарную 64-битную запись.

6
ответ дан 30 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: