блокировать свободу / атомарные операции между двумя процессами вместо потоков - PullRequest
8 голосов
/ 17 ноября 2011

Я делюсь некоторыми данными между несколькими процессами, используя общую память;Я использую межпроцессные мьютексы для достижения синхронизации.

Мой вопрос заключается в следующем: возможно ли использовать структуры данных без блокировки И / ИЛИ атомарные операции для достижения более быстрой синхронизации без использования взаимных исключений между двумя процессами?

Если нет, то знаете, чтоявляется основной причиной этого?

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

Ответы [ 2 ]

9 голосов
/ 17 ноября 2011

Являются ли эти концепции переносимыми и на процессы?

Да, атомарные операции универсальны как для потоков, так и для процессов, если IIF используется атомарно используемая память.

Атомарная операция - это конкретная инструкция самого процессора, и она ничего не знает о потоках или процессах, это просто комплекс действий "все или ничего" (неделимый) (чтение, сравнение, хранение) с аппаратной реализацией низкого уровня.

Таким образом, вы можете настроить разделяемую память между процессами и поместить в нее atomic_t.

без блокировки

Да, если блокировка без блокировки реализована только с атомарным.(Должно быть)

структуры данных

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

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

межпроцессные мьютексы

И я должен сказать, что glibc> 2.4 (NPTL) использует futex в сочетании с атомарными операциями для неконтролируемой блокировки (для общих разделяемых мьютексов процесса = interмьютексы процесса).Итак, вы уже используете атомарные операции в общей памяти.

2 голосов
/ 17 ноября 2011

В x86 с NPTL большинство примитивов синхронизации имеют в качестве быстрого пути только одну блокированную операцию с полным барьером памяти. Поскольку платформы x86 на самом деле не имеют ничего более легкого, они уже являются лучшим из того, что вы можете сделать. Если существующие атомарные операции не сделают именно то, что вам нужно, не будет никакого повышения производительности, чтобы окупить затраты на использование семантически более легкого примитива.

...