我是否需要锁来访问多线程上下文中不变的数据架构



我有一个不变的数据架构,它是一个功能性hashmap(请参见fash.scm(,在几个线程之间共享。

想象一个线程希望将全局hashmap更改为新版本。我是否需要锁才能更改值?如果是这样,我认为我还需要锁定值才能阅读它,不是吗?

在我看来,这取决于在方案中设置值是否是原子操作。根据C语言的答案,您必须获取锁定指针访问和写入访问的锁。

如果重要的话,我正在使用Guile 2.2.3和Bigloo 4.3。

这一切都取决于您想做什么。通常,如果可以保证该值读取(例如始终是一个数字(,则可以在读取值时不要锁定。例如,

(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,但是只要条目未更新到意外值,我认为可以不锁定。

最新更新