Как проанализировать алгоритм взаимного исключения с помощью двух атомарных вызовов 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 и возвращает предыдущее значение.

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

Как проанализировать этот алгоритм?

0 ответов

Другие вопросы по тегам