2012-04-11 2 views
2

У меня есть игровой сервер, который порождает поток для каждого клиента с forkIO. Я хочу, например, поделиться списком клиентов и списком монстров со всеми из них.Контейнер для Haskell TVars

Моя первая идея состояла в том, чтобы иметь один контейнер TVar для типа данных, содержащего оба списка, но сказать, что два потока одновременно меняют клиента и монстра, которые откатывали бы один из них, если бы я правильно понял эту часть. Что было бы лишним откатом.

Вторая идея состояла в том, чтобы сделать списки TVars, а затем просто передать их в качестве аргументов, но я предпочел бы иметь их в контейнере, чтобы код был чистым и легко управляемым, если нужно добавить больше списков.

Есть ли способ передать пару ТВАР в контейнере, или я переусердствую первую идею?

ответ

3

Как насчет создания только содержащего тип данных, который содержит 2 TVar? Это не сильно отличается от того, как просто передавать TVar s в виде отдельных аргументов, но он держит их «упакованными» вместе, что вам кажется предпочтительным.

data GameState = GameState {clients :: TVar [Client], monsters :: TVar [Monster]} 
Смежные вопросы