首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否需要一个锁来访问多线程上下文中不可变的数据结构?

我是否需要一个锁来访问多线程上下文中不可变的数据结构?
EN

Stack Overflow用户
提问于 2018-02-12 18:38:04
回答 1查看 52关注 0票数 0

我有一个不可变的数据结构,它是一个在多个线程之间共享的函数hashmap (请参阅fash.scm)。

假设一个线程想要将全局hashmap更改为一个新版本。我需要一个锁来改变这个值吗?如果是这样的话,我想我也需要锁定这个值来读取它,不是吗?

在我看来,归根结底是在Scheme中设置一个值是否是一个原子操作。根据这个C语言的答案,您必须为指针的读写访问获得一个锁。

如果重要的话,我使用的是guile 2.2.3和bigloo 4.3。

EN

回答 1

Stack Overflow用户

发布于 2018-02-12 22:15:05

这完全取决于你想做什么。通常,如果可以保证读取该值(例如,总是一个数字),那么在读取该值时不锁定是可以的。例如,

代码语言:javascript
复制
(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的向量,则可能需要锁定。例如:

代码语言:javascript
复制
(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是如何实现的,但是只要条目没有更新到意外的值,我认为不锁定是可以的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48753268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档