Синхронизируется ли с `std :: mutex` медленнее, чем с` std :: atomic (memory_order_seq_cst) `?

Основная причина использования атомик над мьютексами заключается в том, что мьютексы дороги, но с моделью памяти по умолчанию для atomics являющийся memory_order_seq_cstразве это не так дорого?

Вопрос: Может ли параллельная программа, использующая блокировки, быть такой же быстрой, как и параллельная программа без блокировки?

Если так, то это может не стоить усилий, если я не хочу использовать memory_order_acq_rel для атомщиков.


Редактировать:
Я могу что-то упустить, но блокировка на основе не может быть быстрее, чем без блокировки, потому что каждая блокировка также должна быть барьером полной памяти. Но с блокировкой можно использовать методы, которые менее ограничены, чем барьеры памяти.

Итак, вернемся к моему вопросу: блокировка не выполняется быстрее, чем блокировка в новом стандарте C ++ 11 по умолчанию memory_model?

Является ли «lock-free> = на основе блокировки при измерении производительности» истинным? Давайте предположим, 2 аппаратных потоков.


Изменить 2:
Мой вопрос не о гарантиях прогресса, и, возможно, я использую «без блокировки» вне контекста.

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

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

Что касается комментариев, спин-блокировка против мьютекс-блокировки сильно отличается, когда есть очень мало споров.

31

Решение

Lockfree программирование о гарантии прогресса: От самых сильных до самых слабых выжидательную бесплатно, безблокировочного, непроходимость свободной, а также блокирование.

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

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

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

53

Другие решения

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

Кроме того, вы часто будете видеть «алгоритмы блокировки всегда так же быстры, как алгоритмы без блокировки». Это несколько верно. Основная идея заключается в том, что если самый быстрый алгоритм оказывается без блокировки, то самый быстрый алгоритм без гарантии без блокировки — ТАКЖЕ тот же алгоритм! Однако, если самый быстрый алгоритм требует блокировок, то эти требовательные гарантии без блокировок должны искать более медленный алгоритм.

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

2

По вопросам рекламы [email protected]