2

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

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

第二个想法是制作列表 TVar,然后将它们作为参数传递,但如果要添加更多列表,我宁愿将它们放在容器中以保持代码清洁和易于管理。

有没有办法在一个容器中传递几个 TVar 或者我是否过度考虑了第一个想法?

4

1 回答 1

3

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

data GameState = GameState {clients :: TVar [Client], monsters :: TVar [Monster]}
于 2012-04-11T02:53:30.903 回答