成人免费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檢查函數可用

2013-01-07 13:38:56

Android開發布局長度單位

2021-05-25 09:00:00

Kubernetes容器集群

2010-11-18 17:24:27

Oracle旋轉ins

2016-10-21 10:36:54

http2spdynode.js

2022-07-14 23:27:57

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

2010-08-23 17:47:33

DHCP服務器

2012-10-18 09:34:57

CSSdisplayDIV

2009-08-25 16:11:12

Repeater控件

2024-03-17 19:14:28

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩一区 | 蜜桃视频在线观看免费视频网站www | 91视频a | 亚洲精品国产成人 | 91精品福利 | 黄色三级毛片 | 欧美日韩在线视频观看 | 国产美女黄色 | 日韩三级一区 | 羞羞视频在线观免费观看 | 久色激情| 999热精品视频 | 亚洲精品在线看 | 日韩成人av在线 | 欧美精品日韩 | 亚洲精品久久久久久下一站 | 亚洲精彩免费视频 | 久久久久国产精品午夜一区 | 一级毛片在线看 | 国产精品美女www爽爽爽 | 欧美亚洲一区二区三区 | 亚洲激情在线观看 | 欧美视频区| 天天综合天天 | 久久综合99 | av在线免费观看网站 | 日韩一级精品视频在线观看 | 伊人网站| 黄网站涩免费蜜桃网站 | 国产9 9在线 | 中文 | 在线精品一区二区三区 | 欧美一区二区三区 | 中日字幕大片在线播放 | 在线观看免费av网站 | 色av一区二区三区 | 亚洲精品国产一区 | 亚洲免费视频一区 | 国产农村妇女毛片精品久久麻豆 | 韩国毛片一区二区三区 | h片在线观看免费 | 日韩免费在线观看视频 |