代码之家  ›  专栏  ›  技术社区  ›  julien

rust-activx如何在没有互斥的情况下修改结构

  •  1
  • julien  · 技术社区  · 2 年前

    和这个是一样的 question 但使用活性氧。 我有多个线程经常读取,而另一个线程每天写入一次。只要内存得到更新,读者就不必真正关心数据的旧副本还是新副本

    use serde::Serialize;
    use actix_web::{HttpServer, Responder, get, App, HttpResponse, web};
    
    #[derive(Serialize)]
    struct MyStruct {
        a: String,
        b: Vec<String>,
    }
    
    #[get("get")]
    async fn get(data: web::Data<MyStruct>) -> impl Responder {
        return HttpResponse::Ok().json(data);
    }
    
    //not an actual route
    #[get("set")]
    async fn set(data: web::Data<MyStruct>) -> impl Responder {
        //set data to some value
        //
    
        return HttpResponse::Ok();
    }
    
    #[tokio::main]
    async fn main() -> std::io::Result<()> {
    
        let data = web::Data::new(MyStruct::default());
        HttpServer::new(move || {
    
            App::new()
                .app_data(data.clone())
                .service(get)
                .service(set)
         }).bind(("0.0.0.0", 8080))?
        .run()
        .await
    
    }
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Matt    2 年前

    我假设您不想使用Mutex的原因是,这不允许多个线程同时读取值,这将有效地使该路由具有单线程路由的性能。

    要一次允许多个读取器,但一次只能允许一个编辑器,可以使用 RwLock 。这仍然会使您的线程在一个线程更新数据时无法读取,但由于这种情况每天只发生一次,我认为这可能是可以接受的。

    (你也真的不想在数据发生变化时允许读取,因为你可能会得到各种奇怪的部分更新或损坏的数据,尤其是对于更复杂的数据结构)。

    推荐文章