这段代码:
use rayon::prelude::*; // 1.5.0
fn main() {
let mut items = Vec::new();
items.push("hello");
items.push("foo");
items.push("bar");
items.push("ipsum");
let mut counter = 0;
let results = items.par_iter().map(|item| {
// do something time consuming with item
counter += 1;
print!("completed {} items\r", counter);
0
});
}生成一个错误:
warning: unused variable: `item`
--> src/main.rs:12:41
|
12 | let results = items.par_iter().map(|item| {
| ^^^^ help: if this is intentional, prefix it with an underscore: `_item`
|
= note: `#[warn(unused_variables)]` on by default
warning: unused variable: `results`
--> src/main.rs:12:9
|
12 | let results = items.par_iter().map(|item| {
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_results`
error[E0594]: cannot assign to `counter`, as it is a captured variable in a `Fn` closure
--> src/main.rs:14:9
|
14 | counter += 1;
| ^^^^^^^^^^^^ cannot assign发布于 2021-04-06 20:13:22
Rust通过从两个不同的线程写入相同的变量来防止这里的数据竞争。你有几个选择来解决这个问题。这真的要看具体情况了。
Mutex counter。这使您可以安全地访问相同的变量。引入Mutex有消耗并行迭代器所有加速的风险,因为通过Mutex访问一切都是连续的。这是可以接受的,如果map的运行时很大并且锁定Mutex很短。AtomicI32工作得很好,但它们很难或不可能用于更复杂的types.reduce-functions所做的。每个线程将至少有一个计数器,它们将合并在一起以产生一个最终结果。https://stackoverflow.com/questions/66967932
复制相似问题