Rust 1-73-0 新特性:thread_local- 宏的新方法

在 Rust 標準庫中的 thread_local! 宏中,有一個靜態類型 std::thread::LocalKey,用於存儲本地線程的鍵,此鍵使用目標平臺上可用的最快實現。

它是 thread_local! 宏的一個實例,在 Rust 1.73.0 以前的版本,主要使用 LocalKey 的 with 方法,現在可以直接使用 LocalKey 的 get()、set()、take()、replace() 等方法了。

下面看一下新方法的例子。

Get 方法

get() 方法用於返回所包含值的副本。如果線程還沒有引用這個鍵,它將惰性地初始化這個值。

use std::cell::Cell;

thread_local! {
    static X: Cell<i32> = Cell::new(1);
}

fn main() {
    assert_eq!(X.get(), 1);
}

Set 方法

set() 方法用於設置或初始化包含的值。與其他方法不同,這不會運行本地線程的惰性初始化器。相反,如果它還沒有初始化,它將直接用給定的值初始化。 

use std::cell::Cell;

thread_local! {
    static X: Cell<i32> = panic!("!");
}

fn main() {
    // 跳過了上面的初始化式,直接用給定的值進行初始化了
    X.set(123);

    assert_eq!(X.get(), 123);
}

Take 方法

take() 方法用於獲取包含的值,原來位置的值將使用 Default:: Default() 覆蓋。如果這個線程還沒有引用這個鍵,它將惰性地初始化這個值。

use std::cell::Cell;

thread_local! {
    static X: Cell<Option<i32>> = Cell::new(Some(1));
}

fn main() {
    assert_eq!(X.take(), Some(1));
    assert_eq!(X.take(), None);
}

Replace 方法

replace() 方法用於將新值替換舊值,並返回舊值。如果這個線程還沒有引用這個鍵,它將惰性地初始化這個值。

use std::cell::Cell;

thread_local! {
    static X: Cell<i32> = Cell::new(1);
}

fn main() {
    assert_eq!(X.replace(2), 1);
    assert_eq!(X.replace(3), 2);
}

總結

新方法使公共代碼更加簡潔,並且對於新線程,避免了爲 thread_local 中指定的默認值運行額外的初始化代碼。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mbM6pxfYKxr-e-ycb-PxDg