原子操作 memory order 設定

這個設定可以限制 CPU 亂序執行的執行順序,簡單說明如表:

設定值順序
relaxedOO不影響
acquireOX後面的程式要等這行執行完了才會執行,
即後面的程式不會早於此操作執行。
releaseXO前面的程式要都執行完了才會執行後面的程式,
即前面的程式不會晚於此操作執行
acq_relOO等同 acquire + release
seq_cstOO視操作類型加上 acquire, release, acq_rel 其一,並依序向其他線程同步
consumeOX等同 acquire,但只向與該變數有關的線程同步
據說編譯器沒實作這東西,沒驗證是否為真

整理資訊原文

  • memory_order_relaxed:純原子操作,不影響順序
  • memory_order_acquire:只能用於取值,且確保後面變數的讀寫操作不會再取值前開始(即保證後面的變數操作不會被往前排)
  • memory_order_release:只能用於寫值,寫值前會確保前面變數的讀寫操作都完成了(即保證前面的變數操作不會被往後排)
    關聯點:使用 memory_order_acquire 的線程會向使用 memory_order_release 且同一個原子變數的線程同步所有更動(包含非原子變數)
    重點:只有相關的線程才會同步,其他線程不一定同步
    memory_order_acq_rel:即把兩個動作變為一個原子操作,所以前面的變數操作不會往後跑,反過來也一樣。
    做完的同時,變數也同步完了
  • memory_order_seq_cst:視操作附有 memory_order_acquire, memory_order_release, memory_order_acq_rel 三種特性之一,且依序向所有線程同步!
  • 最後是 memory_order_consume,基本上與 memory_order_acquire 一樣
    但是只對相依的變數做線程同步!
    所以在變數運算上如果沒有與該原子變數關聯(比如作為運算參數),那就不會被同步!

, , ,

Related posts

Serde 對現有值進行複寫的反序列化

Serde 反序列化除了基於預設值複寫外,也可以基於其他現有值複寫,通過不在文件上寫明的公開穩定特徵方法 serde::Deserialize::deserialize_in_place() 可以做到。

原始碼中的註解表示,這個方法被隱藏的原因是新手很少使用。我說這很常用吧....

Rust 巨集語法 macro_rules

參考:

https://doc.rust-lang.org/reference/macros-by-example.htmlhttps://veykril.github.io/tlborm/decl-macros/minutiae/fragment-specifiers.html

巨集語法太廣了,看起來還有 @內部規則 之類的用法,之後再看...

定義巨集

macro_rules! 巨集名稱 {
比對規則 => { 產生程式 };
...
}

比對規則

參數輸入

使用巨集時填入的參數會基於 Rust 語法被編譯器分解為帶階層的字串組,再對規則做比對

a+b 會分解為 a +...

在 Rust 用 trait 實現 OOP 的單層多重繼承

有了這寫法,就可以輕鬆實現多種功能隨意組合了

純方法,沒有依賴結構

直接寫 trait 跟 impl Trait for Struct {}

有依賴結構

// 功能 A
mod func_a {
#
pub struct FuncAStruct...

vim 操作

啟動參數

-p 可將多個檔案各別開到標籤頁

快速鍵

= 文字重新排版、格式化

za 開關 fold

. 重複文字操作

@: 重複指令操作

^ / Home 前往行開頭

$ / End 前往行結尾

g t...

Leave a Comment

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *