< 返回版块

coco 发表于 2023-10-08 17:17

又碰到不会写的代码了。请大佬教我,万分感谢。 这种情况我怎么应对。我要在线程里调用 mut a 的 stop 方法来结束 a.start 中的 loop。

#![allow(unused)]

struct A {
    stop: bool,
    val: i32,
}

impl A {
    pub fn new() -> Self {
        A {
         stop: false,
         val: 1,
        }
    }
    
    pub fn stop(&mut self) {
        self.stop = true;
    }
    
    pub fn start(&mut self) {
        loop {
            if self.stop {
                break;
            }
            println!("loop...{}", self.val);
            self.val += 1;
            std::thread::sleep(std::time::Duration::from_millis(1000));
        }
    }
}

struct B {}

impl B {
    pub fn new() -> Self {
        B {}
    }
    
    pub fn stop<F: ?Sized>(&self, callback: &F) where F: Fn() {
        println!("callback");
        callback();
    }
    
}

fn main() {
  let mut a = A::new();
  let b = B::new();
  std::thread::spawn(move || {
      b.stop(&||{
          a.stop();
      });
  });
  a.start();
}

play: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9a5bbac1008e976a5f3da5d43c5f506e

评论区

写评论
作者 coco 2023-10-08 22:05

好的。谢谢

--
👇
Pikachu: mutex

另外建议把the book认真看一遍。第16章fearless concurrency就专门讲的如何写多线程。

作者 coco 2023-10-08 22:05

谢谢你。我开始也是用Arc::new(Mutex::new(a)) 把整个 struct 的实例包起来,发现不行。确实没想到可以包里面的属性。非常感谢

--
👇
night-cruise: 用 Mutex 干就完事了:

#![allow(unused)]
use std::sync::{Arc, Mutex};

struct A {
    stop: Mutex<bool>,
    val: Mutex<i32>,
}

impl A {
    pub fn new() -> Self {
        A {
         stop: Mutex::new(false),
         val: Mutex::new(1),
        }
    }
    
    pub fn stop(&self) {
        *self.stop.lock().unwrap() = true;
    }
    
    pub fn start(&self) {
        loop {
            if *self.stop.lock().unwrap() {
                break;
            }
            println!("loop...{:?}", self.val);
            *self.val.lock().unwrap() += 1;
            std::thread::sleep(std::time::Duration::from_millis(1000));
        }
    }
}

struct B {}

impl B {
    pub fn new() -> Self {
        B {}
    }
    
    pub fn stop<F: ?Sized>(&self, callback: &F) where F: Fn() {
        println!("callback");
        callback();
    }
    
}

fn main() {
  let a = Arc::new(A::new());
  let b = B::new();
  
  let a2 = a.clone();
  std::thread::spawn(move || {
      b.stop(&||{
          a2.stop();
      });
  });
  
  a.start();
}
作者 coco 2023-10-08 21:59

是的,我的疏忽,忘记点 share,就直接复制了链接。已更新。

--
👇
bestgopher: 你这个链接有啥用

night-cruise 2023-10-08 18:04

用 Mutex 干就完事了:

#![allow(unused)]
use std::sync::{Arc, Mutex};

struct A {
    stop: Mutex<bool>,
    val: Mutex<i32>,
}

impl A {
    pub fn new() -> Self {
        A {
         stop: Mutex::new(false),
         val: Mutex::new(1),
        }
    }
    
    pub fn stop(&self) {
        *self.stop.lock().unwrap() = true;
    }
    
    pub fn start(&self) {
        loop {
            if *self.stop.lock().unwrap() {
                break;
            }
            println!("loop...{:?}", self.val);
            *self.val.lock().unwrap() += 1;
            std::thread::sleep(std::time::Duration::from_millis(1000));
        }
    }
}

struct B {}

impl B {
    pub fn new() -> Self {
        B {}
    }
    
    pub fn stop<F: ?Sized>(&self, callback: &F) where F: Fn() {
        println!("callback");
        callback();
    }
    
}

fn main() {
  let a = Arc::new(A::new());
  let b = B::new();
  
  let a2 = a.clone();
  std::thread::spawn(move || {
      b.stop(&||{
          a2.stop();
      });
  });
  
  a.start();
}
bestgopher 2023-10-08 18:02

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d814ccd7ba07a1094fcfdbced2c403e5

Pikachu 2023-10-08 17:44

mutex

另外建议把the book认真看一遍。第16章fearless concurrency就专门讲的如何写多线程。

bestgopher 2023-10-08 17:30

你这个链接有啥用

1 共 7 条评论, 1 页