理解这个Clojure代码
我对Clojure很陌生,我一直在努力实现一些并发代码。 我在网上找到了这段代码。 有一个警告,它不是在Clojure中进行并发的正确方法,但我仍然想理解此代码。
(def *readers* (map #(agent %) '("one" "two" "three")))
(def *writers* (map #(agent %) '("four" "five")))
(def *mutex* (agent :unlocked))
(def *value* 0)
; mutex implementation
(defn lock [state who success-fn fail-fn]
(send who (if (= state :locked) fail-fn success-fn))
:locked)
(defn unlock [mutex]
:unlocked)
; Must be invoked with send-off since this handler blocks
(defn rand-sleep [state next-fn]
(Thread/sleep (rand-int 5))
(send *agent* next-fn)
state)
; Reader functions
(declare try-read)
(defn reader-got-lock [name]
(println (format "Thread %s says that the value is %d." name *value*))
(send *mutex* unlock)
(send-off *agent* rand-sleep try-read)
name)
(defn reader-did-not-get-lock [name]
(println (format "Thread %s tried to read the value, but could not." name))
(send-off *agent* rand-sleep try-read)
name)
(defn try-read [name]
(send *mutex* lock *agent* reader-got-lock reader-did-not-get-lock)
name)
; Writer functions
(declare try-write)
(defn writer-got-lock [name]
(println (format "Thread %s is taking the lock." name))
(def *value* (rand-int 10))
(println (format "Thread %s is changing the value to %d." name *value*))
(send *mutex* unlock)
(println (format "Thread %s is relasing the lock." name))
(send-off *agent* rand-sleep try-write)
name)
(defn writer-did-not-get-lock [name]
(println (format "Thread %s tried to write the value, but could not." name))
(send-off *agent* rand-sleep try-write)
name)
(defn try-write [name]
(send *mutex* lock *agent* writer-got-lock writer-did-not-get-lock)
name)
(dorun (map #(send % try-write) *writers*))
(dorun (map #(send % try-read) *readers*))
具体来说,我卡在这一行:
(defn try-write [name]
(send *mutex* lock *agent* writer-got-lock writer-did-not-get-lock)
name)
它应该锁定互斥锁,并根据互斥锁状态调用writer-got-lock或writer-did-not-get-lock。 但是*agent*
声明在哪里,还是访问当前代理的捷径? 那么一个state
是如何传递给锁的,是否*agent*
在上述呼叫的情况下或*agent*
who
?
*agent*
是当前代理的捷径,由clojure隐式提供。 *agent*
作为who
传递。 最后的调用大致如下所示:
(lock @*mutex* *agent* writer-got-lock writer-did-not-get-lock)
链接地址: http://www.djcxy.com/p/91887.html