Haskell TVars容器

Haskell TVars容器,haskell,concurrency,containers,stm,Haskell,Concurrency,Containers,Stm,我有一个游戏服务器,它为每个使用forkIO的客户端生成一个线程。例如,我想与所有客户共享一个客户列表和一个怪物列表 我的第一个想法是为一个包含两个列表的数据类型使用一个TVar容器,但假设两个线程同时更改一个客户机和一个怪物,如果我理解正确的话,这将回滚其中一个。这将是不必要的回滚 第二个想法是创建列表TVAR,然后将它们作为参数传递,但是如果要添加更多的列表,我更希望将它们放在一个容器中,以保持代码干净并易于管理 有没有办法在一个容器中传递几个TVar,或者我是不是想得太多了?创建一个包含2

我有一个游戏服务器,它为每个使用forkIO的客户端生成一个线程。例如,我想与所有客户共享一个客户列表和一个怪物列表

我的第一个想法是为一个包含两个列表的数据类型使用一个TVar容器,但假设两个线程同时更改一个客户机和一个怪物,如果我理解正确的话,这将回滚其中一个。这将是不必要的回滚

第二个想法是创建列表TVAR,然后将它们作为参数传递,但是如果要添加更多的列表,我更希望将它们放在一个容器中,以保持代码干净并易于管理


有没有办法在一个容器中传递几个TVar,或者我是不是想得太多了?

创建一个包含2个TVar的包含数据类型怎么样?这与仅仅将
TVar
s作为单独的参数传递没有太大区别,但它将它们“打包”在一起,这似乎是您更喜欢的

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