2009-07-19 9 views

Antwort

1

Vielleicht möchten Sie nur das Problem der Veränderlichkeit seitlich verschieben und eine unveränderliche Map anstelle von SortedDictionary verwenden. Auf diese Weise arbeitet Ihre Iteration an einem "Snapshot" der Datenstruktur, ohne dass Sie sich Sorgen machen müssen, dass sie sich unter Ihnen verändert. Dann müssen Sie nur den anfänglichen Zugriff auf den Snapshot sperren.

Zum Beispiel (Warnung, nicht zu sehen, getestet, ob dieser THREAD ist tatsächlich!):

let mymap = ref Map<string,string>.Empty 

let safefetch m = lock(m) (fun() -> !m) 
let safeadd k v m = lock(m) (fun() -> m := Map.add k v !m) 

mymap 
|> safefetch 
|> Map.iter (fun k v -> printfn "%s: %s" k v) 

mymap |> safeadd "test" "value" 
+0

Wäre nicht die Sperre freigegeben, die in safefetch gesetzt wird, kurz bevor Map.iter startet? – Moonlight

+0

Eines der Probleme mit einer Map besteht darin, wie sie von einem Thread an einen Dispatcher in einem anderen Thread übergeben wird. Jede Änderung ergibt eine andere Karte. Wenn ich ein Postfach nicht implementiere, sehe ich nicht, wie ich es weitergeben soll. Eine Schließung vielleicht? – Moonlight

0

Nach einigen es scheint zu denken, dass eine Sperre auf Seq.iteri Platzierung tatsächlich da ein Seq keinen Sinn macht ist faul in F #.

Es ist jedoch interessant festzustellen, dass eine Ausnahme ausgelöst wird, wenn zusätzliche Elemente eines Wörterbuchs von einem anderen Thread während der Iteration der Sequenz eingefügt werden. Nicht sicher, ob dies für eine langsame Iteration vollständig gewährleistet ist.

Meine Lösung (als Funktion) ist im Moment:

 
(fun _ -> 
    lock info (fun _ -> 
       info 
       |> Seq.iteri (fun i x -> ...))) 

Ich hoffe, dass es in Ordnung ist meine eigene Frage zu beantworten (Ich bin hier).

Verwandte Themen