【crossbeam系列】5 crossbeam-util和crossbeam-queue:一些實用的小東西

2021-02-21 Rust語言中文社區
這一次我們來介紹一下crossbeam-util和crossbeam-queue,中的一些東西和用法。crossbeam-utilAtomicCell這個是並發版的std::cell::Cell,可以對&self就起到變更內部值的效果,主要會用到下面三個方法:

use crossbeam_utils::atomic::AtomicCell;

let a = AtomicCell::new(7);

assert_eq!(a.load(), 7);
assert_eq!(a.swap(8), 7);
assert_eq!(a.load(), 8);
a.store(9);
assert_eq!(a.load(), 9);

ShardedLock這個和std::sync::RwLock功能相同,不過相對來說讀會更快而寫更慢。大家在實際使用時可以根據業務的特點酌情選擇。

use crossbeam_utils::sync::ShardedLock;

let lock = ShardedLock::new(5);

// 讀的鎖可以同時獲取
{
let r1 = lock.read().unwrap();
let r2 = lock.read().unwrap();
assert_eq!(*r1, 5);
assert_eq!(*r2, 5);
}

// 寫的鎖只能有一個
{
let mut w = lock.write().unwrap();
*w += 1;
assert_eq!(*w, 6);
}

WaitGroup這個類似Golang中的sync.WaitGroup,可以用來等待幾個線程的工作全部完成。

use crossbeam_utils::sync::WaitGroup;
use std::thread;

// 創建新的等待組
let wg = WaitGroup::new();

for _ in 0..4 {
// 創建等待組的引用
let wg = wg.clone();

thread::spawn(move || {
// 實際邏輯

// 解除對等待組的引用
drop(wg);
});
}

// 會阻塞直到所有線程完成工作
wg.wait();

注意和std::sync::Barrier不同的是,WaitGroup中的線程數量是動態的。scope這個和std::thread比較像,不同點在於能夠支持對當前堆棧的引用。比如如果我們想要寫如下的代碼

let array = [1, 2, 3];
let mut guards = vec![];

for i in &array {
let guard = std::thread::spawn(move || {
println!("element: {}", i);
});

guards.push(guard);
}

for guard in guards {
guard.join().unwrap();
}

是會報錯的,因為編譯器會要求&array具有'static的生命周期。但實際上因為join的部分,所以其實不會有問題,但編譯器並不知道。於是就有了scope的用武之地。有了scope可以這麼寫:

let array = [1, 2, 3];

crossbeam::scope(|scope| {
for i in &array {
scope.spawn(move || {
println!("element: {}", i);
});
}
});

crossbeam-queue這是並發版的隊列,其實可以理解為實現了send和sync的隊列。分為容量有限的ArrayQueue

use crossbeam_queue::{ArrayQueue, PushError};

let q = ArrayQueue::new(2); // 指定容量為2

assert_eq!(q.push('a'), Ok(()));
assert_eq!(q.push('b'), Ok(()));
assert_eq!(q.push('c'), Err(PushError('c')));
assert_eq!(q.pop(), Ok('a'));

use crossbeam_queue::{PopError, SegQueue};

let q = SegQueue::new();

q.push('a');
q.push('b');

assert_eq!(q.pop(), Ok('a'));
assert_eq!(q.pop(), Ok('b'));
assert_eq!(q.pop(), Err(PopError));

當然容量無限的代價是需要動態增加容量,這也使得SegQueue的性能會低一些。crossbeam-queue就這些內容了,是不是很簡單~小結其實util裡面還有一些東西這裡沒有講,大家可以自己去看看。這期講的都是一些零碎的小東西。我們的crossbeam系列到這一期就結束了?嗎?也許下期還有,敬請期待~

相關焦點

  • 【crossbeam系列】4 crossbeam-channel:加強版channel
    這一期的內容會輕鬆一些,講講crossbeam中的channel。可是有人就要問了在標準庫裡面已經有了std::sync::mpsc,為什麼crossbeam又要搞出一套channel呢?
  • 蔡司Crossbeam Laser FIB-SEM數量級加快半導體封裝失效分析
    蔡司Crossbeam Laser產品系列通過飛秒雷射提高速度,通過鎵離子(Ga+)束提高精度,通過SEM進行納米級解析度成像,為封裝工程師和失效分析師提供速度最快的橫截面解決方案和最高成像性能,同時將樣品損壞降至最低。
  • 蔡司(ZEISS)使用Crossbeam Laser FIB-SEM數量級加快半導體封裝...
    蔡司Crossbeam Laser產品系列通過飛秒雷射提高速度,通過鎵離子(Ga+)束提高精度,通過SEM進行納米級解析度成像,為封裝工程師和失效分析師提供速度最快的橫截面解決方案和最高成像性能,同時將樣品損壞降至最低。
  • Huawei beam是什麼 Huawei beam使用方法【圖文】
    很多人在使用華為手機時,會發現華為手機有一個Huawei beam的功能,那麼Huawei beam是什麼呢?Huawei beam怎麼用?下面來看看詳細介紹吧!  Huawei beam是什麼:   想要開啟華為手機的Huawei Beam,首先需要將裡面的NFC功能開啟,下拉動態欄,就可以在下拉框裡找到NFC圖標,點擊一下就可以使用了。
  • 造輪子系列之beam search
    ) , 1 => 6 * 1注意:初始化的時候,我們要將其一個設置為0,其他 beam_size-1路徑設置為-inf這麼做的原因我們可以看下面的解釋現在我們要做的是將 log_prob 和 decoder輸出的 (batch_size x beam_size) , vocab_size
  • LG發布Minibeam微型投影機
    LG發布了最新的Minibeam微型投影儀,可以任何地方顯示任何東西,無論是在現場商務演示或家庭影院的電影體驗等等。而隨著LED技術的不斷進步,用戶再也不用擔心燈泡燒得太早。事實上,LG發布了自己的LED單元,可以持續無故障工作30000小時。或10年每天8小時的使用時間。
  • 你知道off beam是什麼意思嗎?
    對,可以用beam表示。今天,我們就一起看一下beam的用法。首先,我們看一下beam做名詞的用法。1、The car's headlights were on full beam.那輛汽車大開著前燈。這句話中bean的意思是光線、光束。雷射可以表達為a laser beam,一絲絲的光線可以表達為narrow beams of light。
  • Mozilla發布可視化在線跟蹤工具Lightbeam
    日前,Mozilla發布了Firefox瀏覽器擴展組件Lightbeam,旨在幫助用戶理解並提供可視化的在線數據追蹤和分析功能。目前,該項目託管在GitHub上,基於MPL 2.0許可證下發行。
  • Beam Search Decoder 解碼器
    def greedy_decoder(mat): beam searchdef beam_search_decoder(data): sequences = [[list(), 1.0]] expand each current candidate for i in range(len(sequences)): seq, score = sequences[i] for j in range(len(row)): candidate = [seq + [j]
  • LG發布兩款Minibeam家用投影儀 具有電視功能
    如果想要超大尺寸畫面但卻不想花太多錢的話,選擇一款投影儀倒是一個不錯的選擇,價格便宜效果還不錯,只需要一塊幕布便能帶來足夠震撼的視覺體驗。而在投影儀中,憑藉著極好的便攜性,小型或者微型投影儀如今越來越受市場歡迎,已經成為了辦公開會和休閒娛樂的必備利器。隨著LED照明技術的不斷進步,投影儀的使用壽命也越來越長。
  • 三星GALAXY beam功能分析【圖文】
    GALAXY beam怎麼樣?目前在三星投影手機上面,最新款的當屬GALAXY beam。它是結合之前投影手機的特點進行改進的產品,從性能上與其他的投影手機有明顯的差異,也有諸多的不同。下面來詳細了解下GALAXY beam:   三星GALAXY beam  1、豐富的投影功能
  • 最強投影手機 三星GALAXY beam詳細評測
    三星 I8530(Galaxy beam)  圖片  評測  論壇  報價  網購實價  三星GALAXY beam投影手機(I8530)在硬體配置方面屬於當今主流Android手機中等水平,完全可以保證流暢的用戶體驗
  • 三星GALAXY BEAM售2460元
    【PConline香港站行情】  在茫茫的安卓機海中,三星 I8530(Galaxy beam) 無論是在配置上還是外觀上都不出彩,唯獨內置投影功能卻是安卓手機中非常稀有的,採用一塊4英寸屏幕,投影尺寸可達50英寸,外加配備了一塊2000毫安時的鋰電池,整體待機能力自然有著不錯的保證
  • 集成化晶片在相控陣beam-forming中的應用分析
    波束成形(beamforming or spatial filtering)是傳感器陣列中用於定向信號傳輸或接收的信號處理技術。這是通過將天線陣列中的元件以特定角度的信號經歷相長幹涉而其他經歷相消幹涉來實現的。波束成形在發送端和接收端都可以使用,以實現空間選擇性。工程師利用波束成形技術已經有相當久的歷史,比如使用波束來補償信道衰減的衛星通訊。
  • cross什麼意思
    cross什麼意思cross的英文解釋很多,我們慢慢來看~第一種:古代死刑用的十字架、象徵基督教的十字架、十字形狀的物品、十字勳章。A cross第二種:運動中橫傳的名詞和動詞。Police dogs are often a cross.第四種:英式英語中,cross做名詞可以指用來標示位置信息或者標示錯誤的叉號×。
  • In the cross hairs?
    . govt cross-hairs over dealings with 1MDB (Reuters, April 1, 2016).Oh, cross hairs. That’s the hair-like thin cross lines used for aiming a rifle or other firearm at a target.
  • 以太坊通往波卡之路,Moonbeam打通開發者遷徙的最後一環
    藉助以太坊與Parity的Substrate框架之間的兼容性,Moonbeam可能成為幫助波卡(Polkadot)吸引智能合約開發者的重要力量。Moonbeam作為以太坊擴展問題的解決方案Moonbeam還與以太坊智能合約兼容,這意味著開發者將有機會將其項目轉移到Polkadot鏈上。以太坊作為市值排名第二的區塊鏈網絡,以其根深蒂固的網絡效應而聞名,擁有加密貨幣中最強大的開發者社區之一。
  • cross是穿過,finger是手指,那cross one's fingers是什麼意思?
    我們知道cross有「穿過,越過」的意思,finger的意思是「手指」,那cross one's fingers是什麼意思呢?cross one's fingers的意思是「to hope very much that something will happen」,即「祈求好運,希望」。這句習語源於基督教。
  • 能投影的三星I8530(Galaxybeam)熱賣
    【PConline河北石家莊站 行情】在2012年MWC大展上,三星發布了首款支持投影的Android智慧型手機三星 I8530(Galaxy beam)不過投影功能已經不是第一次出現在手機上了,韓系LG早也有過類似產品發布,無奈考慮到當時智能系統不夠普及,於是乎投影手機草草收場。
  • 收藏 | 半導體一些術語的中英文對照
    distribution深度分布:depth distribution投影射程:projected range阻止距離:stopping distance阻止本領:stopping power標準阻止截面:standard stopping cross