作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想编写一个接受整数的函数,并生成使用该整数的线程。可以计算整数。它不需要是文字。如果我使用具体类型,例如 usize
,它会起作用,但是当我尝试概括它时,它 fails to compile :
fn g<A>(a: A)
where
A: num::PrimInt + Copy + std::fmt::Debug + Send,
{
let hs = (0..3).map(|_| {
std::thread::spawn(move || {
println!("{:?}", a);
})
});
for h in hs {
h.join().unwrap();
}
}
错误是:
1 | fn g<A>(a: A)
| - help: consider adding an explicit lifetime bound `A: 'static`...
...
6 | std::thread::spawn(move || {
| ^^^^^^^^^^^^^^^^^^
|
note: ...so that the type `[closure@src/main.rs:6:28: 8:10 a:A]` will meet its required lifetime bounds
--> src/main.rs:6:9
|
6 | std::thread::spawn(move || {
| ^^^^^^^^^^^^^^^^^^
因为我有 Copy
特征,它应该能够为每个线程复制这个值,因此生命周期限制建议是不必要的。我该如何解决这个问题?
最佳答案
Copy
和 'static
是不同的约束,两者 都是跨线程移动值所必需的。虽然您可能只打算将整数(同时满足 Copy
和 'static
)传递给您的泛型函数,但编译器无法确定。它必须能够证明函数体对于所有 可能的类型参数都是有效的。 Copy
但不是'static
的类型的示例是 reference to a local variable :
fn assert_is_copy<T: Copy>(_: T) {}
fn assert_is_static<T: 'static>(_: T) {}
fn main() {
let x: usize = 5;
assert_is_copy(x);
assert_is_static(x);
assert_is_copy(&x);
//assert_is_static(&x); // FAILS TO COMPILE
}
我想您会同意,您不想将对您的 堆栈变量的引用传递给不同的线程(尽管它在 some limited cases 中是安全的)。如果这样做,您可能会分离该线程,弹出带有局部变量的堆栈帧,并导致未定义的行为!
This answer对 T: 'static
的含义给出了一个简单的(大部分)正确的解释。
关于multithreading - 如何将 PrimInt 传递给多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56692197/
我想编写一个接受整数的函数,并生成使用该整数的线程。可以计算整数。它不需要是文字。如果我使用具体类型,例如 usize,它会起作用,但是当我尝试概括它时,它 fails to compile : fn
我是一名优秀的程序员,十分优秀!