(without-interrupts
(push value *global-list*))
(without-interrupts
(setq *global-list* (delete value *global-list*)))
New: use a lock, because delete cannot be done atomically since it reads more than one object before modifying one of them.
(defvar *global-list-lock* (mp:make-lock :name "Global List"))
(mp:with-lock (*global-list-lock*)
(push value *global-list*))
(mp:with-lock (*global-list-lock*)
(setq *global-list* (delete value *global-list*)))