Pull to refresh

Преимущества безблокировочного алгоритма — не только и не столько в производительности

System Programming *
Translation
Рассчитываю, что заключительный пост серии — в отличие от трёх предыдущих, оказавшихся, по-видимому, чересчур хардкорными — вызовет у хабрапублики не только филологический интерес.

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

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

Но преимущества безблокировочной синхронизации не сводятся лишь к улучшенной, по сравнению с привычными примитивами блокировки,  производительности. (Далее в этом посте мы увидим, как можно получить эти неочевидные преимущества, не переходя на полностью безблокировочную синхронизацию.)
Читать дальше →
Total votes 26: ↑22 and ↓4 +18
Views 2.5K
Comments 25

Заметки о синхронизации. Deadlock

C++ *

В наше суровое время, когда мощности процессоров перестали расти ввысь( частота ) и начали расти вширь( число потоков ), проблема синхронизации стоит как нельзя остро. Столкнувшись с этой проблемой на практике, я на себе ощутил, что задача эта намного сложнее, чем кажется на первый взгляд, и какое число подводных граблей она скрывает. В процессе работы над этой проблемой, у меня родилось несколько интересных паттернов, с которым я хочу познакомить хабрасообщество.
Читать дальше →
Total votes 44: ↑37 and ↓7 +30
Views 19K
Comments 78

Два простых правила для предотвращения взаимных блокировок на мьютексах

Нордавинд corporate blog Designing and refactoring *Concurrent computing *
Здравствуйте, уважаемые Хабраюзеры!

Так сложилось, что это третий пост в блоге нашей компании, и, как и первые два, он посвящен вопросам многопоточного программирования и проблемам, которые при этом возникают. Получилось так неслучайно, ведь мы на собственной «шкуре» испытали, что ситуации, возникающие при написании многопоточных программ, невероятно сложны для отладки, так как во многом определяются динамикой работы программы на конкретной аппаратной платформе. Уверен, что большинство программистов сталкивались с ситуацией, когда программа, которая прекрасно работает на одном компьютере, на другом совершенно неожиданно начинает дедлочиться практически «на ровном месте».
Читать дальше →
Total votes 82: ↑73 and ↓9 +64
Views 53K
Comments 50

Рецепты против взаимных блокировок на сигнальных переменных

Нордавинд corporate blog Programming *Designing and refactoring *
Доброго времени суток, уважаемые Хабраюзеры!

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

Рисунок 1 – Взаимная блокировка 1-го рода с участием сигнальной переменной.

В рамках этого поста мы рассмотрим проблемы, которые возникают при использовании сигнальных переменных, и покажем, как их можно избежать.
Читать дальше →
Total votes 45: ↑41 and ↓4 +37
Views 21K
Comments 12

Потоки, блокировки и условные переменные в C++11 [Часть 1]

Programming *C++ *
Tutorial
В первой части этой статьи основное внимание будет уделено потокам и блокировкам в С++11, условные переменные во всей своей красе будут подробно рассмотрены во второй части
Читать дальше →
Total votes 67: ↑67 and ↓0 +67
Views 384K
Comments 14

Потоки, блокировки и условные переменные в C++11 [Часть 2]

Programming *C++ *
Tutorial
Для более полного понимания этой статьи, рекомендуется прочитать ее первую часть, где основное внимание было уделено потокам и блокировкам, в ней объяснено много моментов (терминов, функций и т.д.), которые без пояснения будут использованы здесь.
В данной статье будут рассмотрены условные переменные…
Читать дальше →
Total votes 54: ↑54 and ↓0 +54
Views 141K
Comments 8

Динамический поиск потенциальных взаимоблокировок

C++ *
Sandbox
Здравствуйте. Некоторое время назад начал заниматься сопровождением довольно объемного программного продукта. Правка за правкой и как-то незаметно ко мне подкрались взаимоблокировки. Я быстро выяснил источник проблем — это вложенные блокировки. По незнанию основ программного продукта я неявно нарушил порядок вложения блокировок. Но найти вручную источник проблем не удалось.

Боржоми пить поздно, причитать насчёт архитектуры бессмысленно. Подключаем тяжелую артиллерию.
Читать дальше →
Total votes 14: ↑11 and ↓3 +8
Views 7.2K
Comments 7

Типичные взаимные блокировки в MS SQL и способы борьбы с ними

Mindbox corporate blog Programming *SQL *Designing and refactoring *Microsoft SQL Server *
Чаще всего deadlock описывают примерно следующим образом:
Процесс 1 блокирует ресурс А.
Процесс 2 блокирует ресурс Б.
Процесс 1 пытается получить доступ к ресурсу Б.
Процесс 2 пытается получить доступ к ресурсу А.
В итоге один из процессов должен быть прерван, чтобы другой мог продолжить выполнение.
Но это простейший вариант взаимной блокировки, в реальности приходится сталкиваться с более сложными случаями. В этой статье мы расскажем с какими взаимными блокировками в MS SQL нам приходилось встречаться и как мы с ними боремся.


Читать дальше →
Total votes 20: ↑20 and ↓0 +20
Views 94K
Comments 18

Мы делили ООО

Зарцын и партнеры corporate blog Legislation in IT
Tutorial
По заявкам телезрителей мы продолжаем тему уставного капитала и говорим о долях в нем. Действия учредителей, если один из фаундеров решил выйти из компании, или, более того, что делать, если он из состава учредителей выходить не хочет. Расскажем обо всем на примерах (все персонажи вымышлены).

Читать дальше →
Total votes 11: ↑6 and ↓5 +1
Views 10K
Comments 11

Многопоточный Python на примерах: избавляемся от дедлоков

Ozon Tech corporate blog Python *Programming *Concurrent computing *
Tutorial

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

Разблокировать
Total votes 31: ↑31 and ↓0 +31
Views 9.3K
Comments 14