gpt4 book ai didi

multithreading - 如何将 PrimInt 传递给多个线程?

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

我想编写一个接受整数的函数,并生成使用该整数的线程。可以计算整数。它不需要是文字。如果我使用具体类型,例如 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 answerT: 'static 的含义给出了一个简单的(大部分)正确的解释。

关于multithreading - 如何将 PrimInt 传递给多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56692197/

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