簡體   English   中英

如何在 Rust 中創建 RwLock 的向量?

[英]How to create a vector of RwLock in rust?

我需要制作一個結構向量。 向量的每個元素都必須由 RwLock 保護。 線程需要在這個向量中讀寫(感謝 RwLock )。 我怎么能在 Rust 中做到這一點。

我試過使用 Arc 向量。

#[derive(Default, Debug, Clone, Copy)]
pub struct shared_values {
    x: usize,
    y: usize,
}

fn main() {
    let mut shared = vec![Arc::new(RwLock::new(shared_values { x: 0, y: 0 })); 10];

    //changing value of the element [0]
    {
        let mut sh = shared[0].write().unwrap();
        *sh = shared_values { x: 10, y: 10 };
    }

    //Printing
    {
        println!("Print RwLock");
        for i in 0..g.ns {
            {
                let val = shared[i].read().unwrap();
                println!("{:?}", val);
            }
        }
    }
}

結果是這樣的:

RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }
RwLockReadGuard { lock: RwLock { data: shared_values { suitor: 10, ws: 10 } } }

我希望元素 0 設置為 { x : 10, y : 10 }

我認為 Arc 增加了 shared_values { x : 0 , y : 0 } 的計數引用,但不會為向量中的每個索引創建一個獨立的元素。

此向量初始化克隆參數。 使用std::iter::repeat_with

use std::sync::{Arc, RwLock};

#[derive(Default, Debug, Clone, Copy)]
pub struct SharedValues {
    x: usize,
    y: usize,
}

fn main() {
    let shared: Vec<_> =
        std::iter::repeat_with(|| Arc::new(RwLock::new(SharedValues { x: 0, y: 0 })))
            .take(10)
            .collect();

    //changing value of the element [0]
    {
        let mut sh = shared[0].write().unwrap();
        *sh = SharedValues { x: 10, y: 10 };
    }

    //Printing
    {
        println!("Print RwLock");
        for x in shared {
            println!("{:?}", x.read().unwrap());
        }
    }
}

如果您錯過了宏的簡單性,您可以編寫自己的:

macro_rules! vec_no_clone {
    ( $val:expr; $n:expr ) => {{
        let result: Vec<_> = std::iter::repeat_with(|| $val).take($n).collect();
        result
    }};
}

fn main() {
    let shared = vec_no_clone![Arc::new(RwLock::new(SharedValues { x: 0, y: 0 })); 10];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM