Объясните Майкл и Скотт lock-free очередь alorigthm
Я изучаю алгоритм очереди Майкла и Скотта без блокировки и пытаюсь реализовать его на C++.
но я создал гонку в своем коде и думаю, что в алгоритме может быть гонка.
Я читаю газету здесь: простой, быстрый, и практически не и блокировка Алгоритмы Параллельной Очереди и оригинальный элемент псевдо-код выглядит следующим образом:
dequeue(Q: pointer to queue_t, pvalue: pointer to data type): boolean
D1: loop // Keep trying until Dequeue is done
D2: head = Q->Head // Read Head
D3: tail = Q->Tail // Read Tail
D4: next = head.ptr->next // Read Head.ptr->next
D5: if head == Q->Head // Are head, tail, and next consistent?
D6: if head.ptr == tail.ptr // Is queue empty or Tail falling behind?
D7: if next.ptr == NULL // Is queue empty?
D8: return FALSE // Queue is empty, couldn't dequeue
D9: endif
// Tail is falling behind. Try to advance it
D10: CAS(&Q->Tail, tail, <next.ptr, tail.count+1>)
D11: else // No need to deal with Tail
// Read value before CAS
// Otherwise, another dequeue might free the next node
D12: *pvalue = next.ptr->value
// Try to swing Head to the next node
D13: if CAS(&Q->Head, head, <next.ptr, head.count+1>)
D14: break // Dequeue is done. Exit loop
D15: endif
D16: endif
D17: endif
D18: endloop
D19: free(head.ptr) // It is safe now to free the old node
D20: return TRUE // Queue was not empty, dequeue succeeded
на мой взгляд, гонка вроде этого:
- резьба 1 продвинулся до D3, а затем остановился.
- резьба 2 дополнительно к Д3, Читать же голова как нить 1.
- поток 2, К счастью, продвинулся до D20, в D19 он освободил голову.ptr
- поток 1 продолжается и расширяется до D4, пытаясь прочитать
head.ptr->next
, а какhead.ptr
уже освобожден потоком 1, происходит сбой.
и мой код C++ действительно всегда падает в D4 для потока 1.
может ли кто-нибудь указать на мою ошибку и дать некоторые объяснение ?
1 ответов
Спасибо, очень интересная тема! Это определенно похоже на ошибку, но один из авторов статьи утверждает, что их free() не является нормальным free (), с которым мы все живем, но какой-то волшебный free (), поэтому ошибки нет. Фантастический.
надеюсь, никто не поставил это в производство без тщательного анализа.