Подтвердить что ты не робот

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

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

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

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


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

так что вернемся к моему вопросу... заблокирован ли какой-либо быстрее, чем блокировка, в новом стандарте С++ 11 с по умолчанию memory_model?

является "блокировкой" = блокировкой при измерении в производительности "true? позволяет предположить 2 аппаратных потока.


edit2: мой вопрос заключается не в гарантиях прогресса, а, возможно, в использовании "блокировки" вне контекста.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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