Продажа квадроциклов, снегоходов и мототехники
second logo
Пн-Чт: 10:00-20:00
Пт-Сб: 10:00-19:00 Вс: выходной

+7 (812) 924 3 942

+7 (911) 924 3 942

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

Здравствуйте, уважаемые Хабраюзеры!

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

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

Рецепты, описанные в этом посте весьма просты, но далеко не все даже профессиональные программисты используют осознанно, руководствуясь скорее ощущениями «почему-то кажется, что не стоит захватывать тот мьютекс из под захваченного этого». Так жили и мы долгие-долгие годы, когда в один ужасно ответственный момент не обнаружили, что на «железке», которую нужно срочно отправить заказчику, наш любимый софт не может и часа прожить без дедлока. Убив на решение этой задачи несколько дней работы своих ведущих программистов, мы приняли решение, которое изменило нашу жизнь – мы занялись суровой формализацией ситуаций взаимных блокировок, включающей строгие математические доказательства того, почему так можно делать, а так нельзя. Надо сказать, что исследование наше выродилось в кандидатскую диссертацию одного из сотрудников, но я не уверен, что использованный там формат изложения будет интересен здесь…

Итак, о блокировках с самого начала…

Природа взаимных блокировок

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

Традиционно принято считать, что причиной блокировок всегда являются мьютексы (mutex), однако это не совсем точно. Причиной блокировок могут являться любые средства и механизмы синхронизации, которые предполагают ожидание чего-либо одного потока со стороны другого, например, ожидание сигнала на переменной кондиции (condition variable) или, что значительно менее очевидно, ожидание завершение другого потока (wait/join thread). В теории, на самом деле, второй случай является тем же самым «ожиданием сигнала», однако ввиду неявности этой операции синхронизации, при поиске дедлоков о ней просто забывают, как о потенциальном источнике угрозы и часто не замечают в коде.

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

Несколько слов о модели многопоточных программ

Мы назвали эту модель – «моделью переходов» и представляет она собой совокупность ориентированных графов, где каждый граф представляет собой поток (субъект). Каждый граф имеет одну начальную вершину, соответствующую состоянию, когда ни одно средство синхронизации еще не задействовано, и имеет одну конечную вершину, соответствующую состоянию, когда ни одно средство синхронизации уже не задействовано. Предполагается, что при достижении конечной вершины поток автоматически начинается сначала. Все другие вершины графов представляют собой операцию в отношении того или иного средства синхронизации, например, L (lock) – захват мьютекса, U (unlock) – отпускание мьютекса и т.д. Для доказательств утверждений важно, что модель игнорирует время между выполнениями отдельных операций в отношении средств синхронизации, расширяя тем самым возможный диапазон динамик до бесконечности. Если аудитории Хабра интересна математическая и физическая суть модели, то я готов написать отдельный пост на эту тему, а здесь… всего лишь начало долгой, но интересной истории о многопоточном программировании.

Пример модели, состоящей из одного потока (субъекта):

Рисунок 1.

В соответствии с данным рисунком, субъект может пройти по двум веткам: 0, L1, U1, 0 или 0, L1, L2, U2, U1, 0. Эта схема может рассматриваться, как конечный автомат, грамматика которого включает две фразы {0, L1, U1, 0} и {0, L1, L2, U2, U1, 0}. Будем считать, что время перехода между действиями в отношении средств синхронизации конечно, т.е. алгоритмически корректно. Не будем считать ошибкой синхронизации захват и удержание мьютекса в течение ожидания какого-либо действия пользователя, которое потенциально может никогда не наступить.

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

Простейшая взаимная блокировка с участием мьютексов

Пусть в нашей программе помимо потока (субъекта), приведенного на рисунке 1, есть еще один:

Рисунок 2.

Смею утверждать, что наша программа имеет потенциальный deadlock и даже, если ваши тестировщики утверждают, что все прекрасно работает, то вы не застрахованы от ситуации, что на другом «железе» ваша программа поведет себя вот так:


Рисунок 3.

Ничего не мешает нашим двух независимым потокам выполниться так: поток 1 успел захватить мьютекс 1, затем планировщик переключил выполнение на поток 2, который захватил мьютекс 2, и после этого оба наших потока пытаются захватить мьютексы, которые уже захвачены – deadlock!

Назовем систему потоков (субъектов) несовместимой, если существуют хотя бы один вариант наложения цепочек их выполнения, при котором наступает ситуация взаимной блокировки. Соответственно, совместимой является такая система субъектов, для которой не существует динамики, при которой возможно возникновение ситуации взаимной блокировки.
Рассмотренные два субъекта являются несовместимыми, т.к. существует вариант наложения, приведенный на рисунке 3, при котором возникает ситуация взаимной блокировки. Отметим, что такие субъекты не обязательно будут приводить к блокировке (зависанию) программы. Динамика конкретной работы (время переходов между обращениями к средствам синхронизации) может быть такова, что найденный вариант наложения никогда не проявится в реальности.

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

Рисунок 4

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

Рисунок 5

На рисунке 6 показан другой вариант совмещения цепочек выполнения для модели, представленной на рисунке 5, при котором возникает взаимная блокировка.


Рисунок 6

Прямо так и хочется сказать: Как страшно жить!

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

Первое правило

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

.

Второе правило

Всегда соблюдайте один и тот же порядок захвата мьютексов.

Если вы в одном потоке захватываете мьютекс 1, а затем мьютекс 2, то недопустимо захватывать их в ином порядке в другом потоке.
На самом деле, правило не так просто, как кажется на первый взгляд. Еще раз посмотрим внимательно на Рисунок 6. Там это правило нарушено, но это несколько неочевидно. Глядя на первый поток, мы фиксируем, что мьютекс 2 мы захватываем после мьютекса 1. Глядя на второй поток, мы фиксируем, что мьютекс 3 мы захватываем после мьютекса 2. Объединение этих наблюдений означает, что мьютекс 3 мы захватываем после мьютекса 1, что не выполняется в потоке 3. Результатом этого невыполнения является deadlock, который и показан на рисунке.

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

В заключение хотелось бы задать вопрос: интересна ли эта тема аудитории Хабра? Если да, то есть желание и возможность рассказать о чуть более интересных ситуациях, возникающих при использовании сигнальных переменных и, может быть, немного глубже окунуться в доказательную базу – это уже для искушенных программистов многопоточных приложений.

Надеюсь, этот пост был полезен.

Читайте продолжение — Рецепты против взаимных блокировок на сигнальных переменных.

Что такое блокировка? — ActiveX Data Objects (ADO)

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

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

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

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

Задайте свойство LockType перед открытием набора записей , чтобы указать, какой тип блокировки поставщик должен использовать при открытии. Чтение свойства для возврата типа блокировки, используемого для открытого объекта Recordset .

Поставщики могут не поддерживать все типы блокировок. Если поставщик не может поддерживать запрошенный параметр LockType , он заменит другой тип блокировки. Чтобы определить фактическую функциональность блокировки, доступную в объекте Recordset, используйте метод Supports с adUpdate и adUpdateBatch.

Параметр adLockPessimistic не поддерживается, если свойству CursorLocation присвоено значение

adUseClient. Если задано неподдерживаемое значение, ошибка не приведет к ошибке; Вместо этого будет использоваться ближайший поддерживаемый LockType .

Свойство LockType доступно для чтения и записи при закрытии набора записей и только для чтения при его открытии.

Этот раздел содержит следующие подразделы.

  • Типы блокировок

‎Виджет для медальона в App Store

Скриншоты iPhone

Описание

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

КАК ЭТО РАБОТАЕТ
1. Добавьте виджет «Медальон» на главный экран
2. Когда друг отправляет вам фотографию, она мгновенно появляется на вашем виджете «Медальон»!
3. Чтобы поделиться снимком, коснитесь виджета, сделайте снимок камерой и нажмите «Отправить»! Оно появляется прямо на главных экранах ваших друзей.

ДЛЯ ВАШИХ БЛИЗКИХ ДРУЗЕЙ
• Чтобы поддерживать дружеские отношения, вы можете иметь только 20 друзей в приложении.
• На медальоне не беспокойтесь о количестве подписчиков, просто добавьте своих лучших друзей и семью и живите моментом.
• С медальоном вы можете быть настоящим и делиться фотографиями с важными людьми.

РЕАКЦИЯ НА ФОТОГРАФИИ ДРУЗЕЙ
• Отправить реакцию на медальон своим друзьям, чтобы они знали, что видели их изображение.
• Они получат уведомление, и вам понравится смотреть, как смайлики сыплются на вашу фотографию.
• Мы не подсчитываем и не отслеживаем реакции, поэтому вы можете быть настоящими и искренними, не беспокоясь о лайках и фильтрах, как на других платформах.

СОЗДАЙТЕ ИСТОРИЮ СВОИХ МЕДАЛЬОНОВ
• По мере того, как вы и ваши друзья снимаете медальоны, вы создаете историю всех отправленных изображений.
• Делитесь ими в виде фотографий или используйте нашу функцию повторения видео, чтобы собрать воедино воспоминания о себе и своих друзьях, запечатлев самые приятные моменты.
• В конце каждого месяца Locket также будет делать вам обзорное видео со всеми фотографиями, которыми вы поделились.

ДОБАВЬТЕ МЕДАЛЬОНЫ ДЛЯ ВАШИХ ЛУЧШИХ И ЛЮБИМЫХ
• Украсьте свой домашний экран дополнительными фотографиями и изображениями, посвященными вашей любимой или лучшей подруге
• Добавьте виджет с изображением «Любовь» или «Лучший друг» и просматривайте фотографии только этого человека. Кроме того, вы можете отправлять изображения только этому человеку!

Вот что говорят наши пользователи:

«Мне нравится это приложение, потому что я могу делиться милыми картинками с друзьями» — HI
«УДИВИТЕЛЬНОЕ ТАКОЕ СТОИТ» — rikkibear29282902
«Лучшее приложение, сделанное в этом году» — johanjodel_

Кроме того, пользователи любят нашу камеру (поэтому вам понравятся фотографии!) медальон камеры”

Загрузите бесплатное приложение! Мы оставляем Locket бесплатным, чтобы вы могли отправлять фотографии важным людям (друзьям, семье, лучшим друзьям и т.  д.). С Locket вы почувствуете, что ваш телефон сближает вас с вашими лучшими друзьями.

Пожалуйста, напишите нам по адресу [email protected]. Спасибо за наличие медальона на главном экране!

Версия 1.9.16

Ответить на медальоны сообщениями! Теперь вы можете общаться с друзьями прямо в приложении!

Рейтинги и обзоры

185,9 тыс. оценок

Выбор редакции

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

Мне нравится приложение, одно предложение

Мне нравится это приложение!! Я увидел объявление на TikTok и скачал его, чтобы использовать с родителями, бабушкой и лучшим другом. Мы используем его с конца января, и было очень здорово видеть, как он развивался с тех пор! Мне нравится, что разработчики действительно прислушиваются к предложениям в обзорах, чтобы сделать приложение лучше! Мне также нравится, что я могу видеть фотографии своих друзей и семьи и то, что они делают в течение дня, и начинать разговор об этом! Раньше у меня было много других предложений, но они уже были добавлены в приложение, поэтому теперь у меня есть только одно. Я думаю, было бы очень здорово, если бы мы могли загружать изображения прямо из фотопленки телефона в виджет. Иногда бывают моменты, которыми я хочу поделиться в медальоне, но у меня нет времени открыть приложение медальона, чтобы сделать снимок. Это была бы отличная новая функция, поскольку она быстрее снимает фотографии на камеру телефона, чем на медальон. В целом, мне нравится приложение, и я так взволнован, увидев, как оно будет выглядеть в будущем!

Редактировать: О боже, не могу поверить, что разработчики ответили!! Я рад, что смог помочь добавить в приложение, и я рад видеть будущие обновления!

Ооооо! Спасибо за всю любовь к Медальону 💛! Это согрело наши сердца. Это такие люди, как вы, которые делают это таким увлекательным, и мы рады, что новые обновления будут выходить для вас и ваших друзей по медальону. Спасибо за эту идею. Сейчас мы передаем его команде инженеров, и в ближайшем будущем у него должны появиться новые функции, подобные этой! Спасибо за использование медальона💛

ЛЮБЛЮ ЭТО ПРИЛОЖЕНИЕ, но несколько предложений

это приложение такое забавное и такой милый способ отправлять вещи своим друзьям и близким, однако я хотел бы иметь возможность отправлять разные вещи разным людям. например, я бы не хотел, чтобы то, что я отправляю своему лучшему другу, отправлялось и моей сестре. возможность отправлять фотографии людям по отдельности была бы очень удобной. другое дело, если бы вы могли разместить несколько виджетов на главном экране для разных людей. прямо сейчас у меня есть два моих лучших друга, подключенных к моему медальону, и я хотел бы видеть, что каждый из них присылает мне на моем домашнем экране, но я не могу, потому что одновременно может отображаться только одно изображение. если бы у меня было два виджета, по одному для каждого из них, чтобы я мог видеть, что каждый из них отправляет мне на моем домашнем экране, было бы здорово!! кроме того, это приложение — такая забавная идея, и я надеюсь, что вы продолжите улучшать и развивать его, потому что у него ТАК БОЛЬШОЙ ПОТЕНЦИАЛ!!!!

++ КРОМЕ ТОГО, возможность писать пальцем на фотографиях, сделанных в приложении, была бы такой забавной!!! это позволит вам писать сообщения и забавные рисунки на ваших фотографиях, которые вы отправляете своим близким! не очень важная идея, но я надеюсь, что вы примете ее во внимание из-за ее возможностей и забавной ценности!

События

Разработчик, Locket Labs, Inc. , указал, что политика конфиденциальности приложения может включать обработку данных, как описано ниже. Для получения дополнительной информации см. политику конфиденциальности разработчика.

Данные, связанные с вами

Следующие данные могут быть собраны и связаны с вашей личностью:

  • Контактная информация
  • Пользовательский контент
  • Идентификаторы
  • Данные об использовании
  • Диагностика

Данные, не связанные с вами

Могут быть собраны следующие данные, но они не связаны с вашей личностью:

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

Информация

Продавец
Медальон Лабс, Инк.

Размер
90,3 МБ

Категория
Социальная сеть

Возрастной рейтинг
12+ Нечастое/умеренное употребление алкоголя, табака или наркотиков или рекомендации Нечастая/умеренная ненормативная лексика или грубый юмор Редкий/умеренный сексуальный контент и нагота

Авторское право
© 2022 Locket Labs, Inc.

Цена
Бесплатно

  • Сайт разработчика
  • Тех. поддержка
  • Политика конфиденциальности

Избранное в

Вам также может понравиться

Тональный крем Lock-It — KVD Beauty

Summary

Conscious Beauty at Ulta Beauty™
  • Vegan
  • Cruelty Free

KVD ​​Beauty Lock-It Foundation — веганская жидкая основа с полным покрытием, которая обеспечивает исключительное совершенство и стойкость в течение всего дня. капелька.

Преимущества
  • Маленькая фиксация: достаточно одной капли для полного матового покрытия
  • Стойкость к переносу в течение всего дня делает ретуширование необязательным и сохраняет Lock-It на лице, а не где-либо еще
  • Формула No Flashback содержит оптимизированные пигменты с покрытием для обеспечения чистого пигмента
  • Тщательно разработанные оттенки соответствуют широкому спектру диапазон оттенков и полутонов кожи
  • 100 % веганские продукты, не тестированные на животных
Основные ингредиенты
  • Оптимизированные пигменты с покрытием обеспечивают максимально естественную передачу цвета для безупречного результата
  • Глицерин и кальций улучшают состояние кожи

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

НАКАПИТЕ И СМЕШИВАЙТЕ: нанесите небольшую каплю Lock-It на тыльную сторону ладони. Нанесите кисть Lock-It Edge Foundation Brush #10. Нанесите в центр лица и растушуйте к краям, достигая желаемого уровня покрытия. Помните, что с высококонцентрированным тональным кремом, таким как Lock-It, нужно совсем немного. 2 капли размером с горошину — это максимум, что вам нужно для безупречного полного покрытия.

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

Завершите макияж фиксирующей пудрой Lock-It, фиксирующей пудрой Lock-It или закрепляющим спреем для макияжа Lock-It.

Нужно перекрыть татуировку? Используйте карандаш для губ Everlasting Lip Liner ярко-оранжевого цвета «A-Go-Go», чтобы скорректировать цвет черных чернил, а затем нанесите свой оттенок тональной основы Lock-It поверх.

Диметикон, вода/вода/вода, фенилтриметикон, триметилсилоксисиликат, ПЭГ/ППГ-18/18 диметикон, октенилсукцинат алюминиевого крахмала, бутиленгликоль, изононил изононаноат, диметикон силилат диоксида кремния, димер дилинолеил димер дилинолеат, диметикон кроссполимер, изододекан, глицерин, Хлорид натрия, метикон, полисиликон-11, глицерил каприлат, сорбитан сесквиолеат, тригидроксистеарин, карбонат кальция, сорбат калия, метилпропандиол, каприлгидроксамовая кислота, динатрий ЭДТА. Может содержать/Peut Contenir: оксиды железа (CI 77491, CI 77492, CI 77499), диоксид титана (CI 77891).

Эта основа чертовски лучшая.

Я наполовину латиноамериканка, наполовину белая, так что вы можете себе представить, что моя кожа невозможна. Она очень сухая, и тогда я выгляжу как масляное пятно. Я перепробовала все виды жидких основ и в конце концов сдалась и перешла на пудру (которое покрытие невозможно). Я использую праймер и оттенок 53 в тональной основе Lockit. Я нахожусь в абсолютном раю с обоими. Основа не тяжелая, не липкая и не жирная. Кожу совсем не сушит, а с праймером ОМГ бум-бастик! Я никогда не буду использовать ничего другого!

Я ненавижу эту тональную основу

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

Любимая тональная основа

5

24.12.2022

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

Я продолжаю пробовать другие бренды и продолжаю возвращаться к этому

5

2022-12-22

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

Разное

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *