Распространенным определением без блокировки является то, что по крайней мере один процесс делает успехи. 1
Если у меня есть простая структура данных, такая как очередь, защищенная блокировкой, то один процесс всегда может прогрессировать, поскольку один процесс может получить блокировку, сделать то, что он хочет, и освободить ее.
Так соответствует ли оно определению без блокировки?
1 См., Например, М. Херлихи, В. Лучанко и М. Моир. Синхронизация без препятствий: двусторонние очереди в качестве примера. В Distributed Computing, 2003. «Он не блокируется, если он гарантирует только то, что какой-то поток всегда делает успехи».
multithreading
Джо Пансионат
источник
источник
Ответы:
Это не определение для без блокировки.
Если вы можете гарантировать прогресс, то у вас нет тупиков , и если у вас есть возможное завершение каждого запроса, то у вас нет голодания , но не без блокировок.
Я подвергаю сомнению, действительно ли ваш простой пример обеспечивает это так или иначе. Вам нужны иерархии блокировок и т. Д., Чтобы действительно гарантировать прогресс, когда задействованы несколько блокировок.
источник
Я изучал Искусство многопроцессорного программирования 1, и их тексту не хватает ясности, как и книге, на которую вы ссылаетесь. Вот некоторые цитаты из TAMPP:
Цитата 1 (определение без блокировки)
Цитата 2 (Определение неблокирования)
Цитата 3 (утверждают, что блокировка без блокирования)
Проблема заключается в том, что утверждение в цитате 3, очевидно, не следует из определения в цитате 1. Как уже упоминалось, синхронизированная очередь, кажется, удовлетворяет цитате 1: бесконечно часто какой-либо метод успешно получает блокировку и завершается.
Обратите особое внимание на довольно расплывчатую фразу в цитате 3: «независимо от того, как система планирует потоки». Этому не предшествует какое-либо формальное описание «системы планирования потоков», поэтому нам остается реконструировать ее свойства на основе наших предварительных представлений о том, что определения должны означать:
В такой системе метод блокировки не может быть свободным от блокировки: если поток, удерживающий блокировку, больше никогда не запланирован для выполнения, не будет другого потока, который мог бы завершить свой вызов метода за конечное число шагов, но при этом будет некоторые потоки, которые выполняют шаги метода. Для более реалистичной системы, которая гарантирует предоставление процессорного времени каждому потоку, определение должно явно включать свойство неблокирования:
Исправлено определение без блокировки
1 Морис Херлихи, Нир Шавит, Искусство многопроцессорного программирования, Elsevier 2008, стр. 58-60
источник
Терминология не всегда последовательна, но я думаю, что важно задать следующие вопросы о предлагаемом алгоритме или системе:
Большая часть значимости алгоритмов без блокировок заключается не в том, что они быстрее, чем алгоритмы без блокировок, а в том, что они не склонны к смерти, если поток становится отложенным [обратите внимание, что такая гарантия просто требует что алгоритмы не блокируют, но все алгоритмы без блокировки являются]. Для алгоритма без блокировки возможно использование блокировок, но только если попытки получения блокировки включают в себя тайм-ауты вместе с алгоритмами, чтобы гарантировать, что кто-то всегда сможет прогрессировать (например, алгоритм может использовать
CompareExchange
цикл в качестве своего основного метод арбитража, но используйте блокировки для арбитража доступа, когда конфликт кажется высоким: если кажется, что блокировка удерживается слишком долго, другие потоки могут решить отказаться от попыток использовать эту блокировку и вместо этого создать новую.CompareExchange
отказ клиентов от блокировки не поставит под угрозу целостность системы, хотя это может означать, что код, который удерживал старую блокировку, не будет выполнять какую-либо работу до тех пор, пока он слишком не откажется от старой блокировки и не встанет в очередь для новой.источник
Вы должны посмотреть на «определение», которое вы цитируете в контексте :
Вы используете блокировки для взаимного исключения, поэтому речь идет не о технике без блокировок.
источник
Может быть, но это зависит от алгоритма.
Примечание само по себе .
Если шаг «делай, что он хочет» не включает в себя получение каких-либо других блокировок и гарантированно завершится за конечное время, то эта конкретная часть вашего алгоритма будет свободна от тупиковых ситуаций.
Однако, если эти предварительные условия не выполняются, существует, по крайней мере, вероятность тупиков ...
источник
Приведенный вами пример не блокируется по следующей причине.
Поддержка одного потока получает блокировку, и планировщик ОС приостанавливает поток на бесконечный одиночный период, тогда весь поток не может выполнить процесс, поскольку никто не может получить блокировку, полученную приостановленным потоком.
Вообще говоря, алгоритмы, использующие блокировки, не свободны от блокировки.
Обратите внимание, что без блокировки и без блокировки это две разные концепции. отсутствие взаимоблокировки означает, что возможности взаимоблокировки отсутствуют, но может существовать прямая блокировка, которая может помешать прогрессу всей системы. Свобода блокировки сильнее, чем это, потому что это означает, что некоторые потоки в системе всегда прогрессируют с конечным числом шагов.
источник