當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust LocalKey用法及代碼示例


本文簡要介紹rust語言中 Struct std::thread::LocalKey 的用法。

用法

pub struct LocalKey<T: 'static> { /* fields omitted */ }

擁有其內容的線程本地存儲 key 。

此 key 使用可用於目標平台的最快實現。它使用 thread_local! 宏進行實例化,主要方法是 with 方法。

with 方法產生對包含值的引用,該引用不能跨線程發送或轉義給定的閉包。

初始化和銷毀

初始化在線程內第一次調用 with 時動態執行,實現 Drop 的值在線程退出時被破壞。一些注意事項適用,下文將對此進行解釋。

LocalKey 的初始化程序不能遞歸地依賴於自身,並且以這種方式使用 LocalKey 將導致初始化程序在第一次調用 with 時無限遞歸。

例子

use std::cell::RefCell;
use std::thread;

thread_local!(static FOO: RefCell<u32> = RefCell::new(1));

FOO.with(|f| {
    assert_eq!(*f.borrow(), 1);
    *f.borrow_mut() = 2;
});

// each thread starts out with the initial value of 1
let t = thread::spawn(move|| {
    FOO.with(|f| {
        assert_eq!(*f.borrow(), 1);
        *f.borrow_mut() = 3;
    });
});

// wait for the thread to complete and bail out on panic
t.join().unwrap();

// we retain our original value of 2 despite the child thread
FOO.with(|f| {
    assert_eq!(*f.borrow(), 2);
});

特定於平台的行為

請注意,“best effort” 是為了確保運行存儲在線程本地存儲中的類型的析構函數,但並非所有平台都可以保證將為線程本地存儲中的所有類型運行析構函數。例如,有一些已知的警告沒有運行析構函數:

  1. 在 Unix 係統上,當使用基於 pthread 的 TLS 時,當主線程退出時,不會針對主線程上的 TLS 值運行析構函數。請注意,應用程序也會在主線程退出後立即退出。
  2. 在所有平台上,TLS 都可以在銷毀期間重新初始化其他 TLS 插槽。一些平台通過防止重新初始化已銷毀的任何插槽來確保這種情況不會無限發生,但並非所有平台都有此保護。那些沒有保護的平台通常有一個綜合限製,在此之後不再運行析構函數。

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Struct std::thread::LocalKey。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。