我有一个简单的函数,用来缓存值。我使用一个哈希表作为缓存。缓存将从不同的线程中访问,我希望使用 原子箱 用于控制不同线程的访问。到目前为止,我有以下代码
; Define the local hash table we will use.
(define cache (make-atomic-box (make-hash-table)))
(define-public (make-cache ITEM fv)
(let ((val (hash-ref (atomic-box-ref cache) ITEM)))
(if val
val
(begin
(hash-set! cache ITEM fv) ;;this where I want to use atomic box update functions
fv
))
)
)
现在,我不清楚如何包装一个原子盒更新函数(atomic-box-set!
, atomic-box-swap!
或 atomic-box-compare-and-swap!
)周围的 hash-set
函数来添加新的值到哈希表中。
那么我如何使用原子框来更新哈希表呢?
由于哈希表是可变的,你可以简单地将对哈希表和原子盒的调用堆叠为 (hash-set! (atomic-box-ref cache) ITEM fv)
.
如果你处理的是一个不可变的值,你需要把这个值复制出来 (atomic-box-ref
),并将处理后的值写入(atomic-box-set!
)单独进行。atomic-box-swap!
将这两者结合成一个操作。