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
引用它。读取引用是一个原子操作。
我正在尝试解决这个问题(伪代码):
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
引用它。读取引用是一个原子操作。