필요한 것은 - 작업을 넣을 수있는 간단한 대기열, 무언가입니다. 작업 순서를 유지하지 않고 하나씩 작업자로부터 하나씩 검색 할 수 있습니다. 그것이 올바른 해결책Clojure는 ref 내부의 벡터의 첫 번째 (또는 마지막) 요소를 제거합니다.
;; Definition
(def q (ref []))
;; Put
(defn put-in-queue [i]
(dosync (alter q conj i)))
;; Get
(defn get-from-queue []
(dosync
(let [v (peek q)]
(alter q pop)
v)))
인가 :
나는 이런 식으로 뭔가를 썼다? (어쩌면이 작업을위한 더 나은 해결책도 있습니다)
질문은 다중 스레드 환경에 관한 것입니다. – h3x3d
이것은 다중 스레드 환경에서 완전히 안전하지 않습니까? –
'clojure.core/subvec'는 기본 벡터를 유지하므로 모든 항목이 GC에 대해 무한정으로 적합하지 않게됩니다. (대조적으로,'clojure.core.rrb-vector/subvec'는 실제 슬라이스를 수행하여 주어진 인덱스 범위 밖의 항목을 버립니다.) –