Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在异步块中使用线程不安全值_Multithreading_Rust_Future - Fatal编程技术网

Multithreading 在异步块中使用线程不安全值

Multithreading 在异步块中使用线程不安全值,multithreading,rust,future,Multithreading,Rust,Future,在这个代码片段()中,我们在两个线程之间进行了一些简单的通信。主线程(执行第二个async块)将2发送到async move块中的线程2,该线程接收它,添加自己的值,并通过另一个通道将结果发送回主线程,主线程打印值 线程2包含一些局部状态,Thread\u unsafe变量,它既不是Send也不是Sync,而是跨进行维护的。wait。因此,我们正在创建的impl Future对象本身既不是Send也不是Sync,因此调用pool.spawn\u ok是一个编译错误 然而,这似乎应该是好的。我理解

在这个代码片段()中,我们在两个线程之间进行了一些简单的通信。主线程(执行第二个
async
块)将
2
发送到
async move
块中的线程2,该线程接收它,添加自己的值,并通过另一个通道将结果发送回主线程,主线程打印值

线程2包含一些局部状态,
Thread\u unsafe
变量,它既不是
Send
也不是
Sync
,而是跨
进行维护的。wait
。因此,我们正在创建的
impl Future
对象本身既不是
Send
也不是
Sync
,因此调用
pool.spawn\u ok
是一个编译错误

然而,这似乎应该是好的。我理解为什么
spawn_ok()
不能接受一个不是
Send
的未来,我也理解为什么将异步块编译到状态机中会产生一个包含非
Send
值的结构,但在本例中,我只想发送给另一个线程的是
recv
send2
。我如何表示未来应该在发送后才切换到非线程安全模式

使用std::rc::rc;
使用std::cell::RefCell;
使用futures::channel::oneshot::channel;
使用futures::executor::{ThreadPool,block_on};
fn main(){
让pool=ThreadPool::new().unwrap();
let(send,recv)=通道();
let(send2,recv2)=通道();
pool.spawn\u正常(异步移动{
让线程_unsafe=Rc::new(RefCell::new(40));
让a=recv.wait.unwrap();
send2.send(a+*thread_unsafe.borrow()).unwrap();
});
设r=block_on(异步{
send.send(2.unwrap();
recv2.wait.unwrap()
});
println!(“答案是{}”,r)
}
但在本例中,我只想发送给另一个线程的是
recv
send2


还有一个局部变量
thread\u unsafe
,它在
中使用。wait
。由于
.await
可以挂起异步函数,然后在另一个线程上恢复它,这可能会将
线程不安全的
发送到另一个线程,这是不允许的。

这是
spawn\u ok
的一个属性吗?如中所示,是否有一个执行器总是在任务开始的线程上执行任务,以便执行线程?我想这至少可以在类型系统中表示为一个
Send
闭包,它返回一个非
Send
将来要执行的对象。@mariocneiro它是多线程执行器的一个属性。单线程执行器应该能够生成并执行一个非
Send
的未来,这很好。@Mariocaneiro:事实上,这个例子并不要求未来是
Send
@rodrigo,但这个执行器是完全单线程的,对吗?是否有一个具有线程池类型设置的执行器,其中作业被分配给各个线程,但一旦启动,作业就不会从其线程中移动?@Mariocaneiro:在tokio或async_std的:多线程执行器上抢夺,但任务被固定到创建它的线程上。