gpt4 book ai didi

rust - 在生成的线程中读取不可变值

转载 作者:行者123 更新时间:2023-11-29 07:58:19 25 4
gpt4 key购买 nike

我正在努力让这个例子起作用

use std::sync::mpsc::{Sender, Receiver};
use std::sync::mpsc;
use std::thread;
use std::sync::Arc;

struct User {
reference: String,
email: String
}

struct UserIndex {
reference: usize,
email: usize
}

fn main() {

let rows = vec![
vec!["abcd", "test@test.com"],
vec!["efgh", "test1@test.com"],
vec!["wfee", "test2@test.com"],
vec!["rrgr", "test3@test.com"]
];

let user_index = Arc::new(
UserIndex {
reference: 0,
email: 1
}
);

let chunk_len = (rows.len() / 2) as usize;
let mut chunks = Vec::new();
for chunk in rows.chunks(chunk_len) {
chunks.push(chunk.to_owned());
}

let (tx, rx): (Sender<Vec<User>>, Receiver<Vec<User>>) = mpsc::channel();

for chunk in chunks {
let thread_tx = tx.clone();
thread::spawn(move || {
let user_index_cloned = user_index.clone();
let result = chunk.iter().map( |row|
User {
reference: row[user_index_cloned.reference].to_string(),
email: row[user_index_cloned.email].to_string()
}
).collect::<Vec<User>>();
thread_tx.send(result).unwrap();
});
}

let mut users = Vec::new();
for _ in 0..chunk_len {
users.push(rx.recv());
}

}

但是它抛出一个错误

src/main.rs:43:28: 43:38 error: capture of moved value: `user_index` [E0382]
src/main.rs:43 let user_index_cloned = user_index.clone();
^~~~~~~~~~
note: in expansion of closure expansion
src/main.rs:42:17: 51:4 note: expansion site
note: in expansion of for loop expansion
src/main.rs:40:2: 52:3 note: expansion site
src/main.rs:42:17: 51:4 note: `user_index` moved into closure environment here because it has type `[closure(())]`, which is non-copyable
src/main.rs:42 thread::spawn(move || {
src/main.rs:43 let user_index_cloned = user_index.clone();
src/main.rs:44 let result = chunk.iter().map( |row|
src/main.rs:45 User {
src/main.rs:46 reference: row[user_index_cloned.reference].to_string(),
src/main.rs:47 email: row[user_index_cloned.email].to_string()
...
note: in expansion of closure expansion
src/main.rs:42:17: 51:4 note: expansion site
note: in expansion of for loop expansion
src/main.rs:40:2: 52:3 note: expansion site
src/main.rs:42:17: 51:4 help: perhaps you meant to use `clone()`?
error: aborting due to previous error

现在根据this discussion它应该有效,但它没有。我在这里缺少什么?

最佳答案

你快到了。只是 Arc 必须被克隆到生成线程的外部:

for chunk in chunks {
let thread_tx = tx.clone();
let user_index_cloned = user_index.clone();
thread::spawn(move || {
let result = chunk.iter().map( |row|
User {
reference: row[user_index_cloned.reference].to_string(),
email: row[user_index_cloned.email].to_string()
}
).collect::<Vec<User>>();
thread_tx.send(result).unwrap();
});
}

必须这样做,否则 user_index 确实会被移动到线程中,并且在循环中这样做违反了所有权规则。

关于rust - 在生成的线程中读取不可变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862646/

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