- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通用的 struct
,其中包含设置和一个额外的变量设置,我想对其进行调整和使用。
对于整数范围内的所有可能值,我想启动一个(范围)线程,并将此变量设置为该值。根据这个值,它们的工作略有不同。
这些线程中的每一个都应该能够读取通用设置结构。
use crossbeam; // 0.7.3
struct Settings {
// ... many fields
}
const MAX_FEASIBLE_SCORE: u8 = 10;
fn example(settings: Settings) {
crossbeam::scope(|scope| {
for score in 0..MAX_FEASIBLE_SCORE {
scope.spawn(|_| {
let work_result = do_cool_computation(&settings, score);
println!("{:?}", work_result);
});
}
})
.unwrap();
}
fn do_cool_computation(_: &Settings, _: u8) {}
这不编译:
error[E0373]: closure may outlive the current function, but it borrows `score`, which is owned by the current function
--> src/lib.rs:12:25
|
10 | crossbeam::scope(|scope| {
| ----- has type `&crossbeam_utils::thread::Scope<'1>`
11 | for score in 0..MAX_FEASIBLE_SCORE {
12 | scope.spawn(|_| {
| ^^^ may outlive borrowed value `score`
13 | let work_result = do_cool_computation(&settings, score);
| ----- `score` is borrowed here
|
note: function requires argument type to outlive `'1`
--> src/lib.rs:12:13
|
12 | / scope.spawn(|_| {
13 | | let work_result = do_cool_computation(&settings, score);
14 | | println!("{:?}", work_result);
15 | | });
| |______________^
help: to force the closure to take ownership of `score` (and any other referenced variables), use the `move` keyword
|
12 | scope.spawn(move |_| {
| ^^^^^^^^
这将使 &settings
无效,因为第一个循环迭代将在 move
闭包中获取 settings
的所有权。
让它工作的唯一简单方法是:
Settings
结构复制到每个线程中(这在我的实际应用程序中相当昂贵)settings
周围引入了一个Arc
,这也感觉有点不幸。 有什么办法可以绕过引用计数吗?有没有一种方法可以将 score
move 到内部闭包中,同时仍允许引用 settings
?
最佳答案
是的,可以只将一个或一些变量 move 到闭包中(而不是全部或不 move )。
是的,这可以用来“规避”引用计数。
我在 rayon::scope
的文档中找到了答案事实证明正是关于这个问题:“访问堆栈数据[从范围内的线程范围内]”。该页面还有一个示例,比这个问题中的伪代码更清晰。
事实证明,您可以按如下方式解决此问题:
使用 move
闭包,但通过用引用遮蔽它们来引用外部作用域中的变量,因此通过引用而不是通过值来捕获它们,使用 let settings = &settings
:
```
crossbeam::scope(|scope| {
let settings = &settings; // refer to outer variable by reference
for score in 0..MAX_FEASIBLE_SCORE {
scope.spawn(move |_| {
let work_result = do_cool_computation(settings, score);
println!("{:?}", work_result);
});
}
})
.unwrap();
```
Playground所以在这里,我们 move 了'all used variables'但是预先把settings
变成了一个引用,所以它被借用了。 (迂腐地:我们“move 引用”,但这正是“借用”的意思。)
还有第二种可能:借用所有变量(不 move 任何东西)。
这种可能性适用于许多情况,但不适用于此处。 (因为在这里,我们必须按值捕获 score
,因为在 for 循环的下一次迭代和传递给 scope.spawn 的闭包期间,它不会存在
会比这个长寿)。
摘自 rayon::scope
的文档
use rayon;
fn main() {
let ok: Vec<i32> = vec![1, 2, 3];
rayon::scope(|s| {
let bad: Vec<i32> = vec![4, 5, 6];
s.spawn(|_| {
// Transfer ownership of `bad` into a local variable (also named `bad`).
// This will force the closure to take ownership of `bad` from the environment.
let bad = bad;
println!("ok: {:?}", ok); // `ok` is only borrowed.
println!("bad: {:?}", bad); // refers to our local variable, above.
});
s.spawn(|_| println!("ok: {:?}", ok)); // we too can borrow `ok`
});
}
关于multithreading - 有没有办法让 Rust 闭包只将一些变量移入其中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459643/
我目前正在开发一款炸弹人游戏 :D。老实说,它进行得非常好。我现在正在创建我的 map 编辑器,但我想知道是否可以使用输出流在 .txt 文件中移动?我已经学会了如何使用缓冲区(字符串)读取 whil
基本上,标题...如果没有 QThread(或者它只是被评论)我得到以下结果: LOG> Log working! LOG> PRODUCER: sent resource address: 2998
我有 3 个 View ,并希望将它们集成到一个 View 中,以便它们成为这一 View 中的子文件夹。 我怎样才能做到这一点?还是我必须制作一个 View ,然后再次手动添加和配置这些 View
void rotate( unsigned long mask[], int rotateCnt ); 此函数将当前 64 位掩码 (mask[]) 旋转 rotateCnt 位。如果rotateCn
这是一个非常高级的架构问题。为什么还没有将 JVM 移入linux 内核,它可以更高效(包括即时编译代码)。 我知道这对最小内核的粉丝来说是可恶的,但 Linux 不是那些操作系统之一,它似乎。可以通
我的 Internet 连接速度很慢,我试图避免下载以前的 XCode 文档集和 SDK。 我刚刚安装了 XCode 4.5,发现它们没有包含任何 iOS 版本的文档集。也只有适用于 iOS 6 的
当单击另一个 div 时,如何将一个 div(应该在最右侧的 View 之外)移动到页面上?在下面的代码笔中,我希望绿色 div (id = "three") 离开页面,当单击红色 div (id =
当将 std::unique_ptr 移动到 lambda 中时,无法在其上调用 reset(),因为它似乎是 const : error C2662: void std::unique_ptr>::
我正在将数据库转储到 SQL 转储中: docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -ppassword' > all
我是一名优秀的程序员,十分优秀!