Ich schreibe eine diskrete Simulation, bei der Anforderungswerte von mehreren Threads in einer zentralen Warteschlange gesammelt werden. Alle n Millisekunden wacht ein Manager auf, um Anforderungen zu verarbeiten. Wenn der Manager aufwacht, sollte er alle des Inhalts der zentralen Warteschlange in einem einzelnen diskreten Schritt abrufen. Bei der Verarbeitung sollten alle Client-Threads, die versuchen, an die Warteschlange zu senden, blockiert werden. Wenn die Verarbeitung abgeschlossen ist, wird die Warteschlange wieder geöffnet, und der Manager wechselt wieder in den Ruhezustand.Entfernen des Inhalts eines Chan oder MVar in einem einzelnen separaten Schritt
Was ist der beste Weg, dies zu tun? Das Wiederholungsverhalten von STM ist nicht das, was ich möchte. Wenn ich einen Chan oder MVar verwende, gibt es keine Möglichkeit zu verhindern, dass Clients während der Verarbeitung zusätzliche Anfragen in die Warteschlange stellen. Ein Ansatz besteht darin, einen MVar als Mutex auf einem Chan zu verwenden, der die Warteschlange hält. Gibt es andere Möglichkeiten, dies zu tun?
Oh, Sie können die "Rückseite" vermeiden und die Dinge in der Reihenfolge des Einfügens halten, indem Sie einen etwas komplizierteren Typ innerhalb der 'MVar' verwenden. Ich habe das weggelassen, weil ich es nicht für nötig halte, meine Antwort zu komplizieren. Aber es ist machbar, wenn Sie das wollen. – Carl