Основная причина использования атомарности над мьютексами - это то, что мьютексы дороги, но с моделью памяти по умолчанию для 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
будет много быстрее, чем блокировка мьютекса.
Потому что, если одна нить никогда не затрагивает общую память, вы снова и снова будете блокировать и разблокировать без каких-либо причин, но с атомными операциями вы будете использовать только один цикл ЦП каждый раз.
Что касается комментариев, то спин-блокировка против блокировки мьютекса очень отличается, когда есть очень мало споров.
Ну, есть разные гарантии прогресса между замками, блокировкой и безжизненным кодом. –
[Обязательное чтение] (http://www.1024cores.net/home/lock-free-algorithms). –
watch: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl