发布于 2018-02-12 22:15:05
这完全取决于你想做什么。通常,如果可以保证读取该值(例如,总是一个数字),那么在读取该值时不锁定是可以的。例如,
(import (rnrs) (srfi :18))
(define count 0)
(define t
(thread-start!
(make-thread
(lambda ()
(let loop ()
(display count) (newline)
(thread-sleep! 0.1)
(loop))))))
(do ((i 0 (+ i 1))) ((= i 10))
(set! count (+ count 1))
(thread-sleep! 0.1))这是相当安全的阅读。但是,如果值是长度为1的向量,那么如果其他线程可能将值更改为#f或长度为0的向量,则可能需要锁定。例如:
(import (rnrs) (srfi :18))
(define count (vector 1))
(define t
(thread-start!
(make-thread
(lambda ()
(let loop ()
(display (vector-ref count 0)) (newline)
(thread-sleep! 0.1)
(loop))))))
(do ((i 0 (+ i 1))) ((= i 10))
(vector-set! count 0 (+ (vector-ref count 0) i))
(thread-sleep! 0.1))
(set! count #f) ;; if this happens, the you may want to lock on reader thread我没有检查fash是如何实现的,但是只要条目没有更新到意外的值,我认为不锁定是可以的。
https://stackoverflow.com/questions/48753268
复制相似问题