Я пытаюсь создать неблокирующий пакет очереди -для параллельного приложения, используя алгоритм Магеда М. Майкла и Майкла Л. Скотта, как описано здесь .
Это требует использования атомарного CompareAndSwap, предлагаемого пакетом "sync/atomic"
.
Однако я не уверен, что Go -эквивалентен следующему псевдокоду:
E9: if CAS(&tail.ptr->next, next, )
где tail
и next
имеют тип:
type pointer_t struct {
ptr *node_t
count uint
}
и node
имеет тип:
type node_t struct {
value interface{}
next pointer_t
}
Если я правильно понял, кажется, что мне нужно сделать CAS со структурой (и указателем, иuint
). Возможно ли это даже сatomic
-упаковка?
Спасибо за помощь!