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