实现一个没有锁定的监控线程?

时间:2017-06-02 18:05:57

标签: rust

我有一个结构,可以向通道发送消息以及更新它自己的一些字段。如何定期实现在其内部字段中查找(只读)的监视线程?

我可以使用Arc<Mutex<T>>包装器来编写它,但我觉得它不是那么高效,因为A::x可能是i32,它在堆栈上存储和更新。没有锁,有没有更好的方法呢?

use std::sync::{Arc, Mutex};
use std::sync::mpsc::{channel, Sender};
use std::{thread, time};

struct A {
    x: Arc<Mutex<i32>>,
    y: Sender<i32>,
}

impl A {
    fn do_some_loop(&mut self) {
        let sleep_time = time::Duration::from_millis(200);
        // This is a long running thread.
        for x in 1..1000000 {
            *self.x.lock().unwrap() = x;
            self.y.send(x);
            thread::sleep(sleep_time);
        }
    }
}

fn test() {
    let (sender, recever) = channel();
    let x = Arc::new(Mutex::new(1));
    let mut a = A { x: x.clone(), y: sender };

    thread::spawn(move || {
        // Monitor every 10 secs.
        let sleep_time = time::Duration::from_millis(10000);
        loop {
            thread::sleep(sleep_time);
            println!("{}", *x.lock().unwrap());
        }

    });
    a.do_some_loop();
}

0 个答案:

没有答案