gpt4 book ai didi

rust - 如何向特定线程发送消息?

转载 作者:行者123 更新时间:2023-11-29 08:28:24 25 4
gpt4 key购买 nike

我需要创建一些线程,其中一些线程将运行,直到它们的运行器变量值被更改。这是我的最少代码。

use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;

fn main() {
let mut log_runner = Arc::new(Mutex::new(true));
println!("{}", *log_runner.lock().unwrap());
let mut threads = Vec::new();

{
let mut log_runner_ref = Arc::clone(&log_runner);
// log runner thread
let handle = thread::spawn(move || {
while *log_runner_ref.lock().unwrap() == true {
// DO SOME THINGS CONTINUOUSLY
println!("I'm a separate thread!");
}
});
threads.push(handle);
}

// let the main thread to sleep for x time
thread::sleep(Duration::from_millis(1));
// stop the log_runner thread
*log_runner.lock().unwrap() = false;
// join all threads
for handle in threads {
handle.join().unwrap();
println!("Thread joined!");
}
println!("{}", *log_runner.lock().unwrap());
}

看起来我可以在 1 秒后将日志运行器线程中的 log_runner_ref 设置为 false。有没有办法用一些名称/ID 或类似的东西来标记胎面,并使用其特定标记(名称/ID)向特定线程发送消息?

如果我理解正确,那么 let (tx, rx) = mpsc::channel(); 可用于同时向所有线程而不是特定线程发送消息。我可以在消息中发送一些标识符,每个线程都会寻找自己的标识符来决定是否对接收到的消息采取行动,但我想避免广播效应。

最佳答案

MPSC 代表多个生产者,单一消费者。因此,不,您不能单独使用它来向所有线程发送消息,因为为此您必须能够复制消费者。 工具可用于此目的,但选择它们需要更多信息,而不仅仅是“MPMC”或“SPMC”。

老实说,如果您可以依赖 channel 进行消息传递(在某些情况下这不是一个好主意),您可以为每个线程创建一个 channel ,在线程外部分配 ID,并保留 HashMap而不是 Vec与线程关联的 ID。 Receiver<T>可以移动到线程中(它实现了 Send 如果 T 实现了 Send ),所以你可以毫不夸张地说 move

然后您保留 Sender在外面发送东西给它:-)

关于rust - 如何向特定线程发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57868981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com