2016-07-26 1 views
7

ブール値を含むrefセルを使用すると、スピン待機ループがスピン待機を停止するように指示する問題を非常に簡単に解決できます。私は揮発性(すなわち[<VolatileField>])としてこのフラグをマークする必要がありますが、そのようなフィールドは、コンパイラによると、mutableになる必要があります正確に私は参照をしたくないです - 私はその内容を変更可能ではなく、参照セルフィールド自体。F#:refセルの内容をvolatileとしてマークする方法はありますか?

refセルにその内容を揮発性としてマークする標準的な方法はありますか?自分自身のrefセルをロールする必要がありますか?[<VolatileField>]の標準Refセル定義をコピーしてmutable contentsのすぐ上に貼り付けます。

open System.Threading 

let refCell = ref 0 

Volatile.Write(refCell, 42) 
let fortyTwo = Volatile.Read(refCell) 

あなたも、refの前に&または!を必要としない:まあ、あなただけのREF細胞と正常に動作揮発性...

+3

'Interlocked' APIは' ref'を読み書きするときにメモリバリアを挿入します。それはあなたのために働くだろうか? – FuleSnabel

答えて

7

Volatile.またはInterlocked.方法として、レコードのフィールドをマークすることができないという事実のためにすることを修正セルの変数名は、すでに参照されています。 VolatileおよびInterlockedの方法は、のように[<VolatileField>]よりも推論するのが容易です。

+0

いいリンク、ありがとう! – FuleSnabel

+0

素晴らしい、ありがとう。 – mt99

関連する問題