Барьеры памяти, необходимые для атомной ссылки, подсчитав общие неизменные данные?

StackOverflow https://stackoverflow.com/questions/2599238

Вопрос

У меня есть некоторые неизменные структуры данных, которые я хотел бы управлять с использованием ссылок, сочетается с ними по темам на SMP-системе.

Вот что выглядит код выпуска:

void avocado_release(struct avocado *p)
{
    if (atomic_dec(p->refcount) == 0) {
        free(p->pit);
        free(p->juicy_innards);
        free(p);
    }
}

Делает atomic_dec Нужна барьер памяти в этом? Если это так, какой барьер памяти?

Дополнительные примечания: приложение должно работать на PowerPC и X86, поэтому при желании приветствует любой конкретный процессор. Я уже знаю о атомных соборах GCC. Что касается неизменности, refcount - это Только поле, которое меняется в течение продолжительности объекта.

Это было полезно?

Решение

На X86 он превратится в инструкцию с префиксной сборкой блокировки, как LOCK XADD.
Будучи единой инструкцией, он не прерывается. В качестве добавленного «Feauture» префикс блокировки приводит к полному барьеру памяти:

«... заблокированные операции сериализуют все непогашенные операции нагрузки и хранения (то есть ждать их завершения). ... «Заблокированные операции являются атомные по отношению к всем другим операциям памяти и всеми видимыми извне. " - INTEL® 64 и IA-32 архитектуры программного обеспечения разработчика, Глава 8.1.2.

Барьер памяти фактически реализован как манекен LOCK OR или LOCK AND в обоих сеть а также Java Jit. на x86 / x64.
Таким образом, у вас есть полный забор на X86 в качестве дополнительного бонуса, нравится вам это или нет. :)

На PPC это другое. Ан. Ll / sc. пара - lwarx & stwcx - С вычитанием внутри может быть использован для загрузки операнда памяти в регистр, вычтите один, затем либо запишите его, если не было другого магазина в целевой локации, либо повторить целую петлю, если произошло. LL / SC может быть прервана.
Это также не означает автоматический полный забор.
Тем не менее, это никому не под угрозу компромисс атомность счетчика.
Это просто означает, что в случае X86 вы также получаете забор, «бесплатно».
На PPC можно вставить полный забор, испуская (lw)sync инструкция.

Все вообще, явные барьеры памяти не нужны для атомного счетчика для правильной работы.

Другие советы

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

Барьеры памяти предотвращают переупорядочение чтения и пишеты, и переупорядочение полностью ортогональна для атомности. Например, на PowerPC, если вы реализуете наиболее эффективные атомные природы, то он не предотвращает переупорядочение. Если вы хотите предотвратить переупорядочение, вам нужна инструкция LWSYNC или SYNC или какой-либо эквивалентный высокий уровень (C ++ 11?) Барьер памяти.

Утверждает, что существует «нет возможности компилятора нерешительными вещами проблематично», кажется наивным, как общие заявления, потому что оптимизация компилятора может быть весьма удивительным и потому, что CPU (PowerPC / ARM / ALPHA / MIPS в частности)) агрессивно изменить работу операций памяти.

Когерентный кэш тоже не спасает вас. Видеть http://preshing.com/ Чтобы увидеть, как на самом деле работает память.

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

Вы собираетесь реализовать свой собственный atomic_dec Или вы просто задаетесь вопросом, будет ли поставляемая системой функции, как вы хотите?

В качестве общего правила, поставляемые системой атомные природы / укрепление, будут применять любые барьеры памяти, чтобы просто сделать правильную вещь. Вам вообще не нужно беспокоиться о барьерах памяти, если вы не делаете что-то Wacky, как реализовать собственные бесплатные структуры данных без блокировки или библиотеку STM.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top