成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入研究Rust的內部可變性- Cell是如何工作的?

開發 前端
可變引用則不然,顧名思義,可變引用允許我們改變它們所指向的值。所以在這種情況下,對值有多個引用是不行的。例如,考慮兩個線程,其中每個線程都持有一個獨占引用并同時更改其值。線程運行后的值應該是什么?確切地說,這是一個未定義的行為!

在Rust中,我們從引用借用的規則中知道有不可變(共享)引用和可變(獨占)引用。

如果我們有一個共享引用,我們可以想要多少就有多少。這是因為這些引用不允許我們改變它們指向的值,所以同時有多個引用是可以的。

可變引用則不然,顧名思義,可變引用允許我們改變它們所指向的值。所以在這種情況下,對值有多個引用是不行的。例如,考慮兩個線程,其中每個線程都持有一個獨占引用并同時更改其值。線程運行后的值應該是什么?確切地說,這是一個未定義的行為!

那么為什么Rust允許我們擁有可共享的可變容器呢?這不是打破了Rust的借用規則嗎?這是因為這些容器有限制,允許以安全的方式使用它們,同時仍然提供允許可變的api。這就是為什么這些類型提供“內部可變性”,當使用它們時,它們作為容器施加限制,在這些限制下,它們所持有的類型可以被安全地修改!

Cell 如何提供內部可變性?

基本上,Cell通過確保沒有指向其保存的數據的指針并且在單線程環境中執行來實現這一點。

有了這些限制,更改Cell中的數據是完全可以的。想想看,如果我們知道Cell中沒有指向數據的指針,并且它不是跨線程共享的,則可以保證我們對它具有獨占訪問權。

現在的問題是,Cell是如何施加這些約束的?Cell通過從不返回對其內部數據的引用來實現這一點,它總是返回數據的副本。因此,這已經告訴Cell適用于內存開銷小的類型,例如整數。

此外,Cell沒有實現Sync,因此它不能在線程邊界之間共享。

Cell的構建塊是UnsafeCell,這是Rust內部可變性的構建塊之一。UnsafeCell允許我們在任何時候獲得一個原始的獨占指針,指向它所保存的數據。這當然是一個不安全的操作,所以我們必須在unsafe{}塊中進行操作。

Cell的一種可能的簡化實現是:

use std::cell::UnsafeCell;

struct Cell<T> {
    value: UnsafeCell<T>
}

// 禁止跨線程使用Cell
impl<T> !Sync for Cell<T> {}

impl<T> Cell<T> {
    pub fn new(value: T) -> Self {
        Cell { value: UnsafeCell::new(value) }
    }

    pub fn set(self, value: T) {
        // 用一個新值覆蓋單元格所指向的值
        unsafe { *self.value.get() = value }
    }

    pub fn get(&self) -> T where T: Copy {
        // 返回Cell所指向的數據的副本
        unsafe { *self.value.get() }
    }
}

這里我們使用UnsafeCell來存儲Cell的數據,不允許在線程之間共享此類型,最后,我們從不引用Cell中的數據。注意,get方法只適用于實現Copy的類型,并且返回內部類型的副本。

在本文中,我們探討了Rust的Cell類型,我們了解到Cell通過對其持有的數據施加約束來允許內部可變性。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2021-08-26 09:01:35

內部Rust可變性

2023-10-30 23:38:03

Rust編程基礎

2011-12-15 10:43:20

JavaNIO

2010-05-31 17:45:50

MySQL行鎖

2016-01-12 18:04:55

Java異常研究

2017-06-06 11:29:23

Java異常研究與分析

2010-06-21 13:07:14

2022-05-11 09:03:05

CSS容器文本換行

2011-06-01 10:58:54

Android Service

2010-05-19 14:45:46

2009-12-08 18:45:17

PHP檢查函數可用

2021-05-25 09:00:00

Kubernetes容器集群

2013-01-07 13:38:56

Android開發布局長度單位

2016-10-21 10:36:54

http2spdynode.js

2018-12-24 15:00:58

混合云多云云采用

2010-11-23 16:35:59

MySQL刪除多表數據

2010-11-18 17:24:27

Oracle旋轉ins

2022-07-14 23:27:57

數據分析數據驅動可變數據

2010-08-23 17:47:33

DHCP服務器

2024-03-17 19:14:28

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产精品一区二区 | a国产视频 | 日本成人片在线观看 | 可以在线观看av的网站 | 中文字幕精品一区二区三区精品 | 国产91在线 | 中日 | 国产精品美女久久久久久久网站 | 亚洲综合视频 | 欧美一区二区三区在线看 | 欧美一区二区三区 | 国产精品久久久久久久久久久久久久 | 亚洲狠狠爱 | 国产精品久久久久久久久免费相片 | 久久久视 | 91精品久久久久久久久 | 日本视频一区二区 | 国产精品国产自产拍高清 | 日本三级电影免费观看 | 亚洲综合久久网 | 日韩三级在线 | 国产视频福利一区 | 日韩成人在线观看 | 韩国av一区二区 | 国产精品不卡视频 | 999视频 | 搞黄网站在线观看 | 国产内谢| 亚洲国产一区在线 | 在线免费观看日本视频 | 理论片午午伦夜理片影院 | 亚洲精品视 | 日韩中文一区 | 婷婷毛片| 6080yy精品一区二区三区 | 亚洲天堂久久 | 天天射影院| 密室大逃脱第六季大神版在线观看 | 黄色在线免费观看 | 日韩av成人在线观看 | 国产麻豆乱码精品一区二区三区 | 日韩欧美三区 |