byref 引用引用单元格的值

byref reference to reference cell's value

我偶然发现了这样的问题。我需要一个能知道它被调用了多少次的函数。它需要是线程安全的,所以我想使用 Interlocked.Increment 增加计数器(在这种情况下没有锁定,因为锁定会带走与多线程相关的所有性能增益)。 无论如何,问题是句法问题:如何在引用单元格 (&!counter) 中获取对值的引用?

let functionWithSharedCounter = 
    let counter = ref 0
    fun () ->
        // I tried the ones below:
        // let index = Interlocked.Increment(&counter)
        // let index = Interlocked.Increment(&!counter)
        // let index = Interlocked.Increment(&counter.Value)
        printfn "captured value: %d" index

functionWithSharedCounter ()
functionWithSharedCounter ()
functionWithSharedCounter ()

干杯,

F# 自动将 ref 类型的值视为 byref 参数,因此您不需要任何特殊语法:

let functionWithSharedCounter = 
    let counter = ref 0
    fun () ->
        let index = Interlocked.Increment(counter)
        printfn "captured value: %d" index

您还可以引用可变字段,因此您也可以编写以下内容:

let index = Interlocked.Increment(&counter.contents)

这适用于 contents,但不适用于 counter.Value,因为那是 属性。