douchuan 发表于 2020-12-11 10:24
这段代码来自crossbeam backoff.rs
step的类型直接设置为u32可以吗?为何用Cell包裹?
pub struct Backoff { step: Cell<u32>, }
谢谢答复
-- 👇 fakeshadow: 你这个不需要Mutex,用AtomicU64就可以了。
你这个不需要Mutex,用AtomicU64就可以了。
-- 👇 dollarkillerx: 我是这样用Cell的 不知道对不对
比如这个WaitGroup实现 内部我已经实现了 数据的线程安全 内部有锁
use async_std::sync::{Mutex}; use async_std::task; use std::cell::Cell; pub struct WaitGroup { // Remaining Tasks task: Mutex<Cell<u64>> } impl WaitGroup { pub async fn new() -> WaitGroup { WaitGroup { task: Mutex::new(Cell::new(0)), } } pub async fn add(&self) { let task = self.task.lock().await; task.set(task.get() + 1); } pub async fn done(&self) { let task = self.task.lock().await; task.set(task.get() - 1); } pub async fn wait(&self) { loop { let tk = self.task.lock().await; if tk.get() == 0 { break; } task::sleep(std::time::Duration::from_millis(100)).await; } } }
pub struct WaitGroup { // Remaining Tasks task: Mutex<u64> } let mut wg = WaitGroup
如果这个结构内部没有使用Cell 要改变内部的值就需要 let mut wg = WaitGroup; 但是在多线程传递时 let wg = Arc::new(WaitGroup); // Arc是不允许传递可变 变量的 我就要
let wg = Arc::new(Mutex::new(WaitGroup))
我是这样用Cell的 不知道对不对
Cell实现了内部可变性
评论区
写评论谢谢答复
--
👇
fakeshadow: 你这个不需要Mutex,用AtomicU64就可以了。
你这个不需要Mutex,用AtomicU64就可以了。
--
👇
dollarkillerx: 我是这样用Cell的 不知道对不对
比如这个WaitGroup实现 内部我已经实现了 数据的线程安全 内部有锁
如果这个结构内部没有使用Cell 要改变内部的值就需要 let mut wg = WaitGroup;
但是在多线程传递时 let wg = Arc::new(WaitGroup); // Arc是不允许传递可变 变量的
我就要
我是这样用Cell的 不知道对不对
比如这个WaitGroup实现 内部我已经实现了 数据的线程安全 内部有锁
如果这个结构内部没有使用Cell 要改变内部的值就需要 let mut wg = WaitGroup;
但是在多线程传递时 let wg = Arc::new(WaitGroup); // Arc是不允许传递可变 变量的
我就要
Cell实现了内部可变性