2013-10-16 3 views
2

필요한 것은 - 작업을 넣을 수있는 간단한 대기열, 무언가입니다. 작업 순서를 유지하지 않고 하나씩 작업자로부터 하나씩 검색 할 수 있습니다. 그것이 올바른 해결책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))) 

인가 :

나는 이런 식으로 뭔가를 썼다? (어쩌면이 작업을위한 더 나은 해결책도 있습니다)

답변

2

올바른 해결책은 가능성이 가장 높은 java.util.concurrent.LinkedBlockingQueue하는 java.util.concurrent 큐를 사용하는 아마. j.u.c 대기열은 작업에 완벽하게 맞고 Clojure에서 잘 작동합니다.

5 개 생산자 및 소비자 2 비교를 위해 두 가지 방법으로 구현 제한된 크기의 큐와 시나리오의 Producer consumer with qualifications SO 질문 my answer 참조 : 첫째로 c.l.PersistentQueue을 가진 제 j.u.c.LinkedBlockingQueue.

0

dsm은 큐가 필요할 때 대기열을 사용하고 실제로 벡터가 필요하고 끝에서 물건을 추가하고 앞면에서 제거하려는 경우 subvecconj이 모두 O 1) 벡터에 대한 함수.

user> (subvec [1 2 3] 1) 
[2 3] 
user> (conj [1 2 3] 4) 
[1 2 3 4] 
user> (-> [] (conj 1 2) (conj 3) (subvec 1)) 
+0

질문은 다중 스레드 환경에 관한 것입니다. – h3x3d

+0

이것은 다중 스레드 환경에서 완전히 안전하지 않습니까? –

+1

'clojure.core/subvec'는 기본 벡터를 유지하므로 모든 항목이 GC에 대해 무한정으로 적합하지 않게됩니다. (대조적으로,'clojure.core.rrb-vector/subvec'는 실제 슬라이스를 수행하여 주어진 인덱스 범위 밖의 항목을 버립니다.) –