2012-04-11 8 views
2

Ich habe einen Spieleserver, der mit forstabIO einen Thread für jeden Client erzeugt. Ich möchte zum Beispiel eine Liste von Kunden und eine Liste von Monstern mit allen teilen.Container für Haskell TVars

Meine erste Idee war, einen TVar-Container für einen Datentyp mit beiden Listen zu haben, aber sagen zwei Threads ändert einen Client und Monster zur gleichen Zeit, das würde Rollback eines von ihnen, wenn ich diesen Teil richtig verstanden habe. Was wäre ein unnötiger Rollback.

Die zweite Idee war, die Listen TVars zu machen und sie dann einfach als Argumente zu übergeben, aber ich würde sie lieber in einem Container haben, um den Code sauber zu halten und einfach zu verwalten, wenn weitere Listen hinzugefügt werden sollen.

Gibt es eine Möglichkeit, ein paar TVars in einem Container zu überholen oder überschätze ich die erste Idee?

Antwort

3

Wie wäre es, nur einen enthaltenden Datentyp zu erstellen, der 2 TVar s enthält? Dies ist nicht viel anders als nur die TVar s als separate Argumente zu übergeben, aber es hält sie "verpackt" zusammen, die Sie bevorzugen zu bevorzugen.

data GameState = GameState {clients :: TVar [Client], monsters :: TVar [Monster]}