< 返回版块

douchuan 发表于 2020-12-11 10:24

这段代码来自crossbeam backoff.rs

step的类型直接设置为u32可以吗?为何用Cell包裹?

pub struct Backoff {
    step: Cell<u32>,
}

评论区

写评论
WorldLink 2020-12-12 10:21

谢谢答复

--
👇
fakeshadow: 你这个不需要Mutex,用AtomicU64就可以了。

fakeshadow 2020-12-11 16:45

你这个不需要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))  
WorldLink 2020-12-11 12:01

我是这样用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))  
93996817 2020-12-11 10:38

Cell实现了内部可变性

1 共 4 条评论, 1 页