문제

내가 하려고 배우 Clojure API 와 문서를 사이트에서 사용할 수 있습니다.나는 비트에 대한 불분명 변경 가능장에서 Clojure 고 있는지 확인하려면 내 이해 올바른 것입니다.알려주시기 바랍 있는 경우에는 아이디어를 했는데 잘못입니다.

편집:나 업데이트로 수신 의견에 그것의 정확성이 있어야 한다.


면책 조항:이 모든 정보는 비공식과 잠재적으로 잘못입니다.를 사용하지 않는 게시물을 얻는 방법을 이해 Clojure 작동합니다.


Vars 항상 포함하는 루트 바인딩 가능성당-스레드 구속력이 있습니다.그들은 비교적 변수에 필수적 언어와 적응되지 않는 정보를 공유하기 위한 스레드 간. (주셔서 감사합니다 아 Ulfeldt)

Refs 위치 공유 사이에 스레드를 지원하는 원래의 상태를 변경할 수 있습의 번호를 심판 하나의 트랜잭션이 있습니다.트랜잭션 노 종료함에 따라 동기식(dosync)과 갈등 해결을 자동으로 STM 법(롤백,큐 대기,etc.)

는 위치도록 하는 정보를 비동기적으로 공유 사이 스레드로 최소한의 오버헤드를 파견하여 독립적으로 행동 기능을 변경하는 대리인의 상태가 됩니다.인은 즉시 반환되므로 차단하지 않지만 에이전트의 값을 설정되지 않은 때까지 전달되는 함수가 완료되었습니다.

원자 위치할 수 있는 동시에 공유 사이 스레드입니다.그들은 지원 안전 조작을 간 다른 스레드입니다.

여기에는 나의 친화적 인 바탕으로 요약에서 사용하는 경우 이러한 구조체:

  • Vars 는 정기적으로 오래된 변수에 필수적 언어입니다.(피하기 때 가능)
  • 원자는 다음과 같 Vars 만으로 스레드 공유하는 안전 수 있는 대한 즉각적인 독서이고 안전한 설정입니다. (주셔서 감사합니다 Martin)
  • 에이전트가 같은 원자지만 오히려 그것을 막고 새로운 스레드를 계산하는 그것의 값만 블록하는 경우는 중간에 값을 변경하고자 할 수 있습 다른 스레드를 알고 있는 그것의 완료 할당.
  • 심판이 공유하는 위치의 잠금 자신에 트랜잭션이 있습니다.대신 프로그래머 결정 동안 무슨 일이 경쟁 조건에 대한 각각의 잠 코드,우리는 단지 시작하는 거래하고자 Clojure 처리하는 모든 잠금 조건 간에 심판하는 트랜잭션이 있습니다.

또한,관련된 개념이 기능 future.나에게 그것을 같이 미래 개체할 수 있으로 설명하는 동시 에이전트가 값을 수 없습니다 모두에서 액세스할 때까지 계산이 완료됩니다.그것도 설명할 수 있습으로 차단 Atom.이러한 정확한 개념의 미래는?

도움이 되었습니까?

해결책

당신이 정말로 Clojure를 받고있는 것 같습니다! 잘 했어 :)

VAR은 모든 스레드에서 "루트 바인딩"이 보이며 각 개별 스레드는 다른 스레드에 영향을 미치면서 보는 값을 변경할 수 있습니다. 내 이해가 올바른 경우 VAR은 모두가 보이는 루트 바인딩이있는 하나의 스레드에만 존재할 수 없으며 처음으로 (DEF ...)로 정의 될 때까지 "반등"할 수 없습니다.

심판은 (doSync ...) 트랜잭션이 끝날 때 커밋되어 변경 사항을 동봉하지만 거래가 일관된 상태로 완료 될 수있을 때만 가능합니다.

다른 팁

나는 당신의 결론에 대한 원자가 잘못:

원자는 다음과 같 Vars 만으로 스레드 공유하는 안전에 차단하는 때까지 가치

원자 변경으로 swap! 또는 낮은 수준으로 compare-and-set!.이지 않는 블록 아무것도. swap! 처럼 작동하는 트랜잭션과 하나의 ref:

  1. 이전 값은 원자와 저장된 스레드컬
  2. 함수를 적용하는 오래된 가치를 생성하는 새로운 가치
  3. 이 작업이 성공하면 비교와 설정이라는 오래되고 새로운 값;는 경우에만 가치 아날로그 전자기구,디지털 전자기 변경되지 않은 다른 thread(여전히 같은 오래된 가치)에는 새로운 가치 기록,그렇지 않으면 작업을 다시 시작에서(1)까지는 성공은 결국.

귀하의 질문에 두 가지 문제가 발견되었습니다.

당신은 말합니다 :

조치가 발생하는 동안 에이전트에 액세스되면 조치가 끝날 때까지 값이 반환되지 않습니다.

http://clojure.org/agents 말 :

에이전트의 상태는 항상 모든 스레드에서 읽을 수 있습니다.

즉, 당신은 에이전트의 가치를 얻기 위해 기다릴 필요가 없습니다 (나는 행동에 의해 변경된 값이 프록시되고 원자 적으로 변경되었다고 가정합니다).

코드 deref-메모드 Agent 이것 (SVN 개정 1382) :

public Object deref() throws Exception{
    if(errors != null)
    {
        throw new Exception("Agent has errors", (Exception) RT.first(errors));
    }
return state;

}

차단이 관련이 없습니다.

또한, 나는 당신이 의미하는 바를 이해하지 못합니다 (심판 섹션)

거래는 Deref 로의 통화에 따라 커밋됩니다

DOSYNC 블록의 모든 조치가 완료되었을 때 거래가 커지고 예외는 발생하지 않았으며 거래를 재조정하지 않았습니다. 제 생각에는 deref 그것과는 아무런 관련이 없지만 아마도 나는 당신의 요점을 오해합니다.

마틴은 원자가 작동이 1시에 다시 시작된다고 말할 때 옳습니다. 스핀 대기라고도합니다. 실제로 자물쇠가 차단되지만 작업이 수행 한 스레드는 작동이 성공할 때까지 차단되므로 비동기 조작이 아닌 차단 작업입니다.

또한 미래에 대해 Clojure 1.1은 약속과 미래에 대한 추상화를 추가했습니다. 약속은 한 스레드에서 다른 스레드로 값을 전달하는 데 사용할 수있는 동기화 구조입니다. 그 가치가 전달 될 때까지 약속을 피하려는 모든 시도는 차단 될 것입니다.

(def a-promise (promise))
(deliver a-promise :fred)

선물은 비동기 계산을 나타냅니다. 그들은 다른 스레드에서 코드를 실행하고 결과를 얻는 방법입니다.

(def f (future (some-sexp)))
(deref f) ; blocks the thread that derefs f until value is available

VAR에는 항상 루트 바인딩이있는 것은 아닙니다. 바인딩을 사용하지 않고 VAR을 만드는 것은 합법적입니다.

(def x)

또는

(declare x)

값이 값을 갖기 전에 X를 평가하려고 시도하면

Var user/x is unbound.
[Thrown class java.lang.IllegalStateException]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top