Rust 存储在Vector中的JoinHandles无法join及Mutex所有权问题
问题1:join方法报错修复
错误原因:JoinHandle::join()方法要求获取JoinHandle本身的所有权,而iter_mut()/iter()只会返回元素的引用,无法转移所有权,同时迭代器的map是惰性执行的,如果不消费迭代器,join逻辑根本不会运行。
修复方法:直接遍历fetch_handle的所有权:
// 修复后写法,直接遍历所有权 for thread in fetch_handle { thread.join().unwrap(); } // 迭代器写法,用into_iter拿所有权,用for_each触发执行 // fetch_handle.into_iter().for_each(|thread| thread.join().unwrap());
问题2:获取Mutex内部数据所有权修复
所有子线程执行完毕后,不会再访问listings变量,你可以用两种方式拿到内部Vec的所有权,不需要修改Listings结构体定义:
方案1:用take方法直接转移(最适合新手)
Vec::take()会把锁内的Vec所有权转移出来,原位置留下空Vec,不影响后续逻辑,不需要处理Arc/Mutex的拆解逻辑:
println!("{}",types::Listings{ date_time: format!("{}", chrono::offset::Local::now()), category: category.to_string(), query: search_query.to_string(), listings: listings.lock().unwrap().take() }.to_json());
方案2:拆解Arc+Mutex拿所有权(更高效,无冗余操作)
子线程销毁后,主线程是Arc的唯一持有者,可以直接拆解Arc和Mutex拿到内部数据的所有权,没有多余的内存操作:
// 拿到Arc内部的Mutex,unwrap确认当前只有主线程持有Arc let mutex = Arc::try_unwrap(listings).unwrap(); // 消费Mutex拿到内部存储的Vec所有权 let listings_data = mutex.into_inner().unwrap(); println!("{}",types::Listings{ date_time: format!("{}", chrono::offset::Local::now()), category: category.to_string(), query: search_query.to_string(), listings: listings_data }.to_json());
内容的提问来源于stack exchange,提问作者Rakshit Shetty
相关产品推荐
相关产品推荐

