Как проанализировать алгоритм взаимного исключения с помощью двух атомарных вызовов test-and-set
Кто-то разместил на этом сайте простой алгоритм взаимного исключения для двух потоков.
bool locks[2];
thread_function() {
bool id = get_id();
while(1) {
if (!tset(&locks[id])) {
if (!tset(&locks[!id])) {
x++; // critical section
break;
}
else locks[id] = false;
}
}
locks[id] = false;
locks[!id] = false;
}
Для темы0 get_id()
возвращается false
и для Thread1 он возвращает true
, Вот tset()
является атомарной функцией test-and-set, которая устанавливает значение своего аргумента в true
и возвращает предыдущее значение.
Перед удалением сообщения автором разные пользователи давали разные ответы на вопросы о том, свободен ли этот алгоритм от условий гонки или тупиков.
Как проанализировать этот алгоритм?