首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chunks_exact_mut线程生命周期

chunks_exact_mut线程生命周期
EN

Stack Overflow用户
提问于 2022-06-10 10:29:13
回答 2查看 43关注 0票数 0

以下代码产生了有趣的结果:

代码语言:javascript
复制
use std::thread;

fn main() {
    let mut handles = Vec::new();
    let mut v = vec![1, 2, 3, 4];
    
    for x in v.chunks_exact_mut(2) {
        let handle = thread::spawn(move || {
            println!("Here's a vector: {:?}", x);
        });
        
        handles.push(handle);
    }

    for h in handles { h.join().unwrap(); }
}
代码语言:javascript
复制
error[E0597]: `v` does not live long enough
  --> src/main.rs:7:14
   |
7  |     for x in v.chunks_exact_mut(2) {
   |              ^^^^^^^^^^^^^^^^^^^^^
   |              |
   |              borrowed value does not live long enough
   |              argument requires that `v` is borrowed for `'static`
...
16 | }
   | - `v` dropped here while still borrowed

为什么“分块”v会改变生命周期?如果没有“分块”v,代码将正确执行。那么为什么现在它会抛出一个错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-10 10:52:36

这里的问题是,thread::spawn将整个生命周期与其他线程完全解耦,因为线程可能会在main已经完成时继续运行。

x是对main中一个变量的引用,不能保证main比线程更长。

我认为您真正想要的是像rayon这样的线程助手库,因为它们已经在内部解决了这些问题:

代码语言:javascript
复制
use rayon::prelude::*;

fn main() {
    let mut v = vec![1, 2, 3, 4];

    v.par_chunks_exact_mut(2).for_each(|x: &mut [i32]| {
        let thread_id = std::thread::current().id();
        println!("{:?}: Here's a vector: {:?}", thread_id, x);
    });
}
代码语言:javascript
复制
ThreadId(5): Here's a vector: [1, 2]
ThreadId(2): Here's a vector: [3, 4]
票数 0
EN

Stack Overflow用户

发布于 2022-06-11 23:35:35

如果没有“分块”v,则在Vec<i32>上迭代。这个迭代器生成类型为i32的项,因此,没有引用,没有生命周期,满足了thread::spawn() (特别是'static需求)的要求。

chunks_exact_mut(),然而,定义在片上。和提供迭代器的&mut [T],所以它确实有一个引用。由于这个引用引用的是v,它存在于main()中,所以它不是'static,也不工作。

如果要在&v上而不是v上迭代,您可以观察到同样的问题,因为迭代器给出了&i32s (游乐场):

代码语言:javascript
复制
error[E0597]: `v` does not live long enough
  --> src/main.rs:7:14
   |
7  |     for x in &v {
   |              ^^
   |              |
   |              borrowed value does not live long enough
   |              argument requires that `v` is borrowed for `'static`
...
16 | }
   | - `v` dropped here while still borrowed

除此之外,我建议使用@Finomnis建议的rayon

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72572801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档