2016-07-26 7 views
7

Natknąłem się na sytuację, w której komórka ref zawierające wartość boolowską pozwala mi dość wygodnie rozwiązać problem polegający na wskazaniu pętli oczekującej na wirowanie, aby zatrzymać oczekiwanie na wirowanie. Muszę oznaczyć tę flagę jako zmienną (tj. [<VolatileField>]), ale takie pole musi być mutable zgodnie z kompilatorem, co jest dokładnie tym, czego nie chcę, aby odniesienie było - Chcę, aby jego zawartość była zmienna, a nie odniesienie do samego pola komórki.F #: czy istnieje sposób na oznaczenie zawartości komórek referencyjnych jako niestabilnej?

Czy istnieje standardowy sposób opowiadać ref komórkę oznaczyć jego zawartość jako lotny lub muszę toczyć własną komórkę ref (tj kopiuj-wklej średnia definicja komórek ref z [<VolatileField>] zatrzymany tuż nad mutable contents)? Dobrze, że sprostowanie do faktu, że nie można zaznaczyć pola nagrać jako lotny ...

+3

Interfejs API "Interlocked" wstawia bariery pamięci podczas odczytu/zapisu 'ref'. czy to byłoby dla Ciebie ok? – FuleSnabel

Odpowiedz

7

Volatile. lub Interlocked. metody po prostu działają dobrze z komórkami Ref:

open System.Threading 

let refCell = ref 0 

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

Nie trzeba nawet & lub ! przed ref nazwy zmiennych komórek, są już odniesieniami. Volatile i Interlocked metody są łatwiejsze do zrozumienia niż od [<VolatileField>] zgodnie z opisem here.

+0

Dobry link, dzięki! – FuleSnabel

+0

Super, dzięki. – mt99

Powiązane problemy