如何将指向可变变量的指针共享给线程?
How to share a pointer to a mutable variable to a thread?
我必须为我的国际象棋引擎实施 UCI protocol。
需要从命令行读取命令。当发送 go
命令时,必须开始搜索。然而,在这个搜索过程中,其他命令如 stop
仍然必须被接收。在 stop
的情况下,搜索必须完全退出。
这是代码的样子(省略了不重要的细节)。
pub fn main() {
let mut stop: bool = false;
loop {
line.clear();
stdin.read_line(&mut line).ok().unwrap();
let arg: Vec<&str> = line.split_whitespace().collect();
let cmd = arg[0];
match cmd.trim() {
"" => continue,
"go" => {
stop = false;
thread::spawn(move || start_search(&stop, GameState, History, Timecontrol));
}
"stop" => {
stop = true;
thread::sleep(Duration::from_millis(50));
}
"quit" => {
stop = true;
thread::sleep(Duration::from_millis(50));
break;
}
_ => {
println!("Unknown command {}", line);
}
}
}
}
pub fn start_search(stop_reference: &bool, _: GameState, _: History, _: Timecontrol) {
/* Do search stuff here...
*/
//Has to break when stop_reference is set to true
}
此代码无效,因为我假设该字段刚刚被复制。但是我已经尝试提供结构,然后代码会抱怨,因为您不能同时拥有可变引用和普通引用。我还研究了与线程通信的方法。然而,大多数解决方案都使用通道来实现这一点,但我认为通道在我的情况下不起作用,因为线程总是在计算,所以它只会在它终止后接收通道的命令。
您需要使用一个特殊的引用,一个 Arc 来在线程之间共享布尔值:
pub fn main() {
let stop = Arc::new(AtomicBool::new(false));
loop {
//...
let stop = Arc::clone(&stop);
thread::spawn(move || {
start_search(stop);
})
}
}
pub fn start_search(stop: Arc<AtomicBool>) {
loop {
if stop.load(Ordering::Relaxed) {
// STOP
}
}
}
我必须为我的国际象棋引擎实施 UCI protocol。
需要从命令行读取命令。当发送 go
命令时,必须开始搜索。然而,在这个搜索过程中,其他命令如 stop
仍然必须被接收。在 stop
的情况下,搜索必须完全退出。
这是代码的样子(省略了不重要的细节)。
pub fn main() {
let mut stop: bool = false;
loop {
line.clear();
stdin.read_line(&mut line).ok().unwrap();
let arg: Vec<&str> = line.split_whitespace().collect();
let cmd = arg[0];
match cmd.trim() {
"" => continue,
"go" => {
stop = false;
thread::spawn(move || start_search(&stop, GameState, History, Timecontrol));
}
"stop" => {
stop = true;
thread::sleep(Duration::from_millis(50));
}
"quit" => {
stop = true;
thread::sleep(Duration::from_millis(50));
break;
}
_ => {
println!("Unknown command {}", line);
}
}
}
}
pub fn start_search(stop_reference: &bool, _: GameState, _: History, _: Timecontrol) {
/* Do search stuff here...
*/
//Has to break when stop_reference is set to true
}
此代码无效,因为我假设该字段刚刚被复制。但是我已经尝试提供结构,然后代码会抱怨,因为您不能同时拥有可变引用和普通引用。我还研究了与线程通信的方法。然而,大多数解决方案都使用通道来实现这一点,但我认为通道在我的情况下不起作用,因为线程总是在计算,所以它只会在它终止后接收通道的命令。
您需要使用一个特殊的引用,一个 Arc 来在线程之间共享布尔值:
pub fn main() {
let stop = Arc::new(AtomicBool::new(false));
loop {
//...
let stop = Arc::clone(&stop);
thread::spawn(move || {
start_search(stop);
})
}
}
pub fn start_search(stop: Arc<AtomicBool>) {
loop {
if stop.load(Ordering::Relaxed) {
// STOP
}
}
}