Multithreading 复制'std::thread::spawn'会导致堆栈溢出 描述

Multithreading 复制'std::thread::spawn'会导致堆栈溢出 描述,multithreading,rust,Multithreading,Rust,我试图在我的Windows计算机上的#[no_std]板条箱中生成线程,但我在函数中遇到了问题。首先,我用std创建了一个板条箱,并试图在libstd中找到负责生成线程的位置 Libstd代码(缩短为仅显示相关部分) //libstd/thread/mod.rs pub fn spawn(f:f)->JoinHandle 哪里 F:FnOnce()->T, F:发送+'静态, T:发送+'静态, { 生成器::new().spawn(f).expect(“未能生成线程”) } //libstd/

我试图在我的Windows计算机上的
#[no_std]
板条箱中生成线程,但我在函数中遇到了问题。首先,我用std创建了一个板条箱,并试图在libstd中找到负责生成线程的位置

Libstd代码(缩短为仅显示相关部分)
//libstd/thread/mod.rs
pub fn spawn(f:f)->JoinHandle
哪里
F:FnOnce()->T,
F:发送+'静态,
T:发送+'静态,
{
生成器::new().spawn(f).expect(“未能生成线程”)
}
//libstd/thread/mod.rs
impl生成器{
pub fn spawn(self,f:f)->io::Result
哪里
F:FnOnce()->T,
F:发送+'静态,
T:发送+'静态,
{
不安全{self.spawn_unchecked(f)}
}
未选中发布不安全fn生成,框结果
哪里
F:FnOnce()->T,
F:发送+'静态,
T:发送+'静态,
{
//`kernel32.CreateThread`类似于启动例程。
外部“系统”fn线程\u开始(f:*mut u8)->u32{
不安全{
框::来自_raw(
f as*mut Box T,
T:发送+'静态
>(
安全属性:*常量u8,
堆栈大小:usize,
起始地址:外部“系统”fn(*多框)->u32,
参数:*mut框,
属性:u32,
id:*mut u32
)->使用;
}
我想这应该是可能的,我只是做错了什么,因为它在libstd中工作。

在线

let p = Box::new(Box::new(f));
unsafe { Box::from_raw(main as *mut Box<dyn FnOnce()>)(); }
您正在创建一个
。这里的两个框是细指针,因为
F
恰好是
大小的
,而且
总是
大小的

在线

let p = Box::new(Box::new(f));
unsafe { Box::from_raw(main as *mut Box<dyn FnOnce()>)(); }
现在,这还不够;强制转换无效,因为
F
实现了
FnOnce()->t
,而不是
FnOnce()
(这是
FnOnce()->()
)的缩写。将绑定的
F:FnOnce()->t
更改为
F:FnOnce())
并删除
spawn_std_like
try_spawn_std_like
上现在冗余的
T
将解决此问题。另一个选项是在返回
()
的闭包中包装
f

让p=Box::new(Box::new(| |{f()})作为Box);
在线上

let p = Box::new(Box::new(f));
unsafe { Box::from_raw(main as *mut Box<dyn FnOnce()>)(); }
您正在创建一个
。这里的两个框是细指针,因为
F
恰好是
大小的
,而且
总是
大小的

在线

let p = Box::new(Box::new(f));
unsafe { Box::from_raw(main as *mut Box<dyn FnOnce()>)(); }
现在,这还不够;强制转换无效,因为
F
实现了
FnOnce()->t
,而不是
FnOnce()
(这是
FnOnce()->()
)的缩写。将绑定的
F:FnOnce()->t
更改为
F:FnOnce())
并删除
spawn_std_like
try_spawn_std_like
上现在冗余的
T
将解决此问题。另一个选项是在返回
()
的闭包中包装
f

让p=Box::new(Box::new(| |{f()})作为Box);

效果很好!我觉得我的
类型有问题,因为通用
线程启动
例程工作正常。很高兴知道
框(大小)
很薄。因此,我需要首先将其作为fat
框来装箱,这样才能将其作为fat
框来使用。谢谢!这很有魅力!我觉得我的
类型有问题,因为通用的
线程开始
例程工作正常。很高兴知道
框(大小)
很薄。因此,我需要首先将其作为fat
框进行装箱,以便将其用作fat
框。谢谢!