2013-04-30 4 views
31

Основная причина использования атомарности над мьютексами - это то, что мьютексы дороги, но с моделью памяти по умолчанию для atomics, являющейся memory_order_seq_cst, разве это не так дорого?Синхронизируется с `std :: mutex` медленнее, чем с` std :: atomic (memory_order_seq_cst) `?

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

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


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

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

«Блокировка» = блокировка при измерении в исполнении «правда? Предположим, что 2 аппаратных потока.


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

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

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

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

+0

Ну, есть разные гарантии прогресса между замками, блокировкой и безжизненным кодом. –

+8

[Обязательное чтение] (http://www.1024cores.net/home/lock-free-algorithms). –

+1

watch: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

ответ

53

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

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

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

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

+0

ok - но 2 потока с общими данными. Не согласитесь ли вы, что спин-блокировка быстрее блокировки блокировки? – jaybny

+0

например, торговое приложение, которое прослушивает отметки из 2 обменов на 2 потока. не будет ли спин-замок намного быстрее, чем мьютекс? – jaybny

+4

@jaybny: Нет, почему. И спин-блокировка также является блокировкой. Он не меняет основополагающих гарантий. И, пожалуйста, взгляните на реализацию мьютекса pthread для приятного сюрприза. –

2

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

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

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

+0

«Алгоритмы блокировки всегда бывают быстрыми, как алгоритмы блокировки». -Я просто не понимаю. потокобезопасный цикл с разделяемой памятью будет намного быстрее, выполняя простой compare_exchange, а затем блокировку (mutex) разблокировки (mutex). особенно если никогда не возникает соперничество от другой нити. – jaybny

Смежные вопросы