gpt4 book ai didi

multithreading - MUD 服务器的 Rust 同步策略

转载 作者:行者123 更新时间:2023-11-29 08:13:04 24 4
gpt4 key购买 nike

因此,如果您有一个 MUD 服务器在单独的进程中处理每个 tcp 连接,

for stream in acceptor.incoming() {
match stream {
Err(e) => { /* connection failed */ }
Ok(stream) => spawn(proc() {
handle_client(stream)
})
}
}

为该服务器共享可变世界数据的策略是什么?我可以想象 n 个连接响应用户的命令。每个命令都需要访问并可能修改世界。

pub struct Server<'a> {
world: World<'a>
}

pub struct World<'a> {
pub chat_rooms: HashMap<&'a str, ChatRoom<'a>>
}


impl<'a> World<'a> {
pub fn new() -> World<'a> {
let mut rooms = HashMap::new();
rooms.insert("General", ChatRoom::new("General"));
rooms.insert("Help", ChatRoom::new("Help"));
World{chat_rooms: rooms}
}
}

Arc 是可行的方法吗?

let shared_server = Arc::new(server);
let server = shared_server.clone();

spawn(proc() {
// Work with server
});

如何扩展到 100 或 1000 个用户?我只是在寻找正确方向的插入力。

最佳答案

Arc将允许您从多个任务中访问一个值,但不允许您可变地借用该值。编译器无法静态验证一次只有一个任务会可变地借用值,并且在不同任务上同时改变一个值会导致数据竞争

Rust 的标准库提供了一些允许安全地改变共享对象的类型。这是其中两个:

  • Mutex : 这是一个简单的互斥锁Mutex 包装了 protected 值,因此访问该值的唯一方法是锁定互斥锁。一次只有一个任务可以访问包装的值。
  • RWLock : 这是一个读写锁。这种锁允许多个任务同时读取一个值,但写入者必须具有独占访问权限。这与借用检查器和 RefCell 的规则基本相同(除了锁会等待直到借用被释放,而不是编译失败或 panic )。

您需要将 MutexRWLock 包装在 Arc 中,以使其可供多个任务访问。

关于multithreading - MUD 服务器的 Rust 同步策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26834412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com