Я говорю о блокировке заявки, которая может выглядеть следующим образом (в синтаксисе псевдо-C):
unsigned int ticket_counter = 0, lock_counter = 0;
void lock() {
unsigned int my_ticket = fetch_and_increment(ticket_counter);
while (my_ticket != lock_counter) {}
}
void unlock() {
atomic_increment(lock_counter);
}
Давайте предположим, что такая блокировка заявки синхронизирует доступ к критической секции S, которая не требует ожиданиявыполнение критического раздела занимает ровно c циклов / инструкций.Предполагая, что в системе не более p потоков, синхронизация S с использованием блокировки заявок ограничена без ожидания?
По моему мнению, так и есть, поскольку блокировка билетов является справедливой и, следовательно, верхняяожидание - O (p * c).
Я ошибаюсь?Я немного смущен.Я всегда думал, что блокировка подразумевает не быть (ограниченной) без ожидания из-за следующего утверждения: «Невозможно построить реализацию без очереди ожидания, стека, очереди приоритетов, набора или списка из набора атомарных регистров.«.(Следствие 5.4.1 в Искусстве многопроцессорного программирования, Херлихи и Шавит)
Однако, если блокировка билета (и, возможно, любой другой механизм справедливой блокировки) ограничена без ожидания в соответствии с упомянутыми предположениями, она (может)позволяет создавать ограниченные реализации без ожидания реализации очереди, стека и т. д. (Это вопрос, с которым я фактически столкнулся.)
Напомним определение ограниченного ожидания без ожиданияв «Искусстве многопроцессорного программирования», стр.59 Херлихи и Шавита:
«Метод не требует ожидания, если он гарантирует, что каждый вызов завершает свое выполнение за конечное число шагов.свободен, если есть ограничение на количество шагов, которые может выполнить вызов метода. "