Что я не понимаю, так это то, как поток проверяет, удерживается ли блокировка другим процессом, прежде чем войти в критическое видение.
Для этого вам понадобится "atomi c fetch" , может быть что-то вроде "while( atomic_fetch(currently_serving) != my_ticket) { /* wait */ }
".
Если у вас есть "atomi c fetch and add", то вы можете реализовать "atomi c fetch", выполнив "atomi c fetch and add значение ноль ", может быть что-то вроде" while( atomic_fetch_and_add(currently_serving, 0) != my_ticket) { /* wait */ }
".
Для справки; полная последовательность может выглядеть примерно так:
my_ticket = atomic_fetch_and_add(ticket_counter, 1);
while( atomic_fetch_and_add(currently_serving, 0) != my_ticket) {
/* wait */
}
/* Critical section (lock successfully acquired). */
atomic_fetch_and_add(currently_serving, 1); /* Release the lock */
Конечно, у вас может быть лучшая выборка atomi c, которую вы можете использовать вместо этого (например, для некоторых процессоров любая нормальная выровненная загрузка - это atomi c).