F# 中的线程安全选项

thread-safe option in F#

我正在尝试解决这个问题(伪代码):

let myObject : T option = None

onEvent (fun t -> if myObject.IsSome then myObject.Value(t))

some logic (
    while forever do
        myObject <- Some T()
        // do something
        myObject <- None
        // do something

我有一个根据某些外部参数创建和销毁的对象。有一个始终触发的偶数,它使数据要么被对象处理(如果存在),要么被忽略。

这里的问题是:

if myObject.IsSome

myObject.Value

状态可能会改变。有没有一种机制来处理这个? 像 Option.TryGet 这样的东西,它要么 return 一个对象,要么不是,以原子的方式?

或者我可以使用任何其他机制吗?

我想我可以尝试直接在 try / with 部分中获取对象值,但我希望得到更清晰的东西。

从可变单元格中取出值并将其保存在局部变量中,然后您可以以线程安全的方式与局部变量进行交互:

onEvent (fun t -> 
    let v = myObject
    if v.IsSome then v.Value(t)
)

之所以有效,是因为 Option 值本身是不可变的。 myObject 的每个突变都会创建一个新的 Option 值并使 myObject 引用它。读取引用是一个原子操作。