Multithreading 如何在一个线程中更新并从多个线程中读取?

Multithreading 如何在一个线程中更新并从多个线程中读取?,multithreading,rust,borrow-checker,Multithreading,Rust,Borrow Checker,我无法通过借用检查器获取此代码: 使用std::sync::Arc; 使用std::thread::{sleep,spawn}; 使用std::time::Duration; [衍生电子书,克隆] 结构状态{ 计数:u64, 不可复制:Vec, } fn螺纹编号:u8,圆弧状态:圆弧{ let state=arc_state.clone; 环路{ 睡眠持续时间:从1000毫克开始; println!thread_num:{},state.count:{},thread_num,state.cou

我无法通过借用检查器获取此代码:

使用std::sync::Arc; 使用std::thread::{sleep,spawn}; 使用std::time::Duration; [衍生电子书,克隆] 结构状态{ 计数:u64, 不可复制:Vec, } fn螺纹编号:u8,圆弧状态:圆弧{ let state=arc_state.clone; 环路{ 睡眠持续时间:从1000毫克开始; println!thread_num:{},state.count:{},thread_num,state.count; } } fn main->std::io::Result{ 让mut state=state{ 计数:0, 不可复制:vec![], }; 让arc_state=arc::newstate; 对于0..2中的i{ 产卵移动| |{ 巴里,arc_state.clone; }; } 环路{ 睡眠持续时间:从300毫米开始; state.count+=1; } } 我可能试错了

我想要一个可以更新状态的主线程和多个可以读取状态的线程

在生锈的地方我该怎么做

我读过,但它使用的互斥体对于单个编写器/多个阅读器的情况来说似乎过于复杂


在C语言中,我可以通过大量的原子来实现这一点。

原子学确实是一种正确的方法,在std中有很多这样的方法。您的示例需要2个修复

在移动到闭包中之前,必须克隆弧,以便循环成为: 对于0..2中的i{ 设arc_state=arc_state.clone; 斯瓦恩莫夫|{bari,arc|u州;}; } 使用AtomicU64相当简单,尽管您需要显式地使用具有指定属性的newtype方法: 使用std::sync::atomic::{AtomicU64,Ordering}; 使用std::sync::Arc; 使用std::thread::{sleep,spawn}; 使用std::time::Duration; [衍生博客] 结构状态{ 计数:原子64, 不可复制:Vec, } fn螺纹编号:u8,圆弧状态:圆弧{ let state=arc_state.clone; 环路{ 睡眠持续时间:从1000毫克开始; 普林顿! 线程数:{},state.count:{}, 线程数, state.count.loadOrdering::released ; } } fn main->std::io::Result{ 让状态=状态{ 计数:AtomicU64::new0, 不可复制:vec![], }; 让arc_state=arc::newstate; 对于0..2中的i{ 设arc_state=arc_state.clone; 产卵移动| |{ 巴里,arc_州; }; } 环路{ 睡眠持续时间:从300毫米开始; //不能在这里使用'state',因为它已移动 arc_state.count.fetch_add1,Ordering::Relaxed; } }