34

这是我使用 Rust 的第一天,但​​我正在尝试做一些微不足道的事情,但我被困住了。

我想要做的是将一个结构添加到一个向量,并返回结果。我正在尝试创建一个非常简单的 REST 服务,该服务将在发布时将数据存储在内存中,并在执行 GET 时以 JSON 格式返回所有数据。

这是我当前的代码:

fn main() {
    let mut server = Nickel::new();
    let mut reservations = Vec::new();

   server.post("/reservations/", middleware! { |request, response|
        let reservation = request.json_as::<Reservation>().unwrap();

        reservations.push(reservation); // <-- error occurs here

        format!("Hello {} {}", reservation.name, reservation.email)

    });

    server.listen("127.0.0.1:3000");
}

我用 RefCell 尝试了这个解决方案,但后来我得到了没有实现特征同步的错误Vec<reservation::Reservation>

4

1 回答 1

45

这是 Rust 如何保护您免受线程不安全的一个很好的例子。

如果您考虑一下,在您当前的代码中,多个线程可能会尝试在reservations没有任何同步的情况下同时进行变异。这是一场数据竞赛,Rust 会抱怨它。

一种可能的解决方案是将reservations向量包装成 aMutex以获得同步。您还需要一个Arc(原子引用计数),因为 Rust 无法证明它reservations比线程寿命更长。

通过这些更改,您的代码应如下所示:

use std::sync::{Arc, Mutex};
fn main() {
    let mut server = Nickel::new();
    let reservations = Arc::new(Mutex::new(Vec::new()));

    server.post("/reservations/", middleware! { |request, response|
        let reservation = request.json_as::<Reservation>().unwrap();

        reservations.lock().unwrap().push(reservation); // <-- error occurs here

        format!("Hello {} {}", reservation.name, reservation.email)

    });

    server.listen("127.0.0.1:3000");
}

Mutex您可以查看文档以获取有关和的更多信息Arc

于 2015-05-31T17:12:29.600 回答