2010-05-15 24 views

cevap

15

ardından cevabım iç dosync dış bir aynı iş parçacığı üzerinde çalışacak olmasına bağlıdır olduğunu. Bir dosync blok girildiğinde kimse bu parçacığı üzerinde zaten çalışıyor edilmemiş ise Clojure ise

, yeni bir işlem başlatılır. Bu, yürütmenin tek bir iş parçacığı üzerinde kalması durumunda, iç işlemlerin dış işlemler tarafından dağıtılabileceği söylenebilir; Ancak, bir dosync, başka bir dosync içinde sözdizimsel olarak iç içe geçmiş bir konumda yer alıyorsa, ancak yeni bir iş parçacığı üzerinde başlatılacaksa, kendisine yeni bir işlem olacaktır.

(umutla) ne gösteren bir örnek:

"iç" işlem :foo baskı sonrası yeniden deneme
user> (def r (ref 0)) 
#'user/r 
user> (dosync (future (dosync (Thread/sleep 50) (println :foo) (alter r inc))) 
       (println :bar) 
       (alter r inc)) 
:bar 
:foo 
:foo 
1 
user> @r 
2 

; "dış" işlemin yeniden başlatılması gerekmez. (Bundan sonra, r'un tarih zincirinin büyüdüğünü unutmayın, bu nedenle "büyük" dosync formu ikinci kez değerlendirildiyse, iç dosync tekrar denemeyecektir. kurs.)

Mark Volkmann, Clojure'un Software Transactional Memory; Bu tür ayrıntılara sağlam bir anlayış kazandırmak isteyen herkes için okumanın şiddetle tavsiye edilir.

+0

Bu örnekten hoşlanıyorum. –

+0

Neden "sözdizimsel" niteleyici? Ve sözdizimsel olarak ne anlama geliyor? Ben ortak bir lisperim ve sözcüksel olarak görünür olan değişkenlerin kapanmasında olduğu gibi "sözcüksel olarak" alışıyorum: (let ((x 42)) (lambda() x)) vs dinamik olarak (ör. Çağrı yığında bir yere bağlı)). – kennytilton

İlgili konular