Rust中堆疊與併發

2021-08-15 06:16:30 字數 1277 閱讀 7438

對不同語言,堆和棧是相通的,只不過,這裡是以rust語言為例,來理解堆和棧。巨集觀上講,這兩個術語是關於記憶體管理的。棧和堆是幫助你決定何時分配和釋放記憶體的抽象(概念)。

首先先列出堆與棧的不同之處,沒有列全:

舉個例子:

fn

main()

fn

main()

box可以理解為裝箱吧,參考:

(乙個引用的值僅僅是乙個記憶體位置的指標)

send+sync

rust中的併發,總會遇到send,sync這兩個特性。如果閱讀**是遇到,也提示了你這段**可能是併發的。

sync,當乙個型別t實現了sync,它向編譯器指示這個型別在多執行緒併發時沒有導致記憶體不安全的可能性。

#[stable(feature = "rust1", since = "1.0.0")]

pubstruct arc

#[stable(feature = "rust1", since = "1.0.0")]

unsafe

impl

send for arc{}//實現send trait

#[stable(feature = "rust1", since = "1.0.0")]

unsafe

impl

sync for arc{}//實現sync trait

執行緒

rust標準庫實現了執行緒庫。使用rust中的多執行緒時有幾個注意的地方:

1. 預設閉包通過引用獲取變數

錯誤例項:

use std::thread;

fnmain() ", x);//程式編譯出錯,因為閉包獲取的是引用,這樣有乙個問題,執行緒可能會存在超過x的作用域,導致產生乙個懸垂指標。

});}

解決辦法之一:

use std::thread;

fnmain() ", x);

});//x不能再在main函式中使用,已被move至新執行緒中

}

use std::sync::;

use std::thread;

use std::time::duration;

fn main() );

}thread::sleep(duration::from_millis(50));//加這一行是為了防止主線程先於子執行緒結束

}

Rust 併發程式設計 Thread Pool

在併發程式設計領域,乙個非常讓程式設計師興奮,感到有成就感的事情就是做效能優化,譬如發現某個執行緒成為了單點瓶頸,然後上多執行緒。提到了上多執行緒,那自然就會引入 thread pool,也就是我們通常說的執行緒池,我們會將任務扔給執行緒池,然後執行緒池裡面自己會負責將任務派發到不同的執行緒去執行,...

Rust的併發程式設計(一)多程序併發

併發,是指在巨集觀意義上同一時間處理多個任務。併發的方式一般包含為三種 多程序 多執行緒以及最近幾年剛剛火起來的協程。首先,我們建立兩個專案,乙個為子程序,乙個為主程序。在子程序的main.rs中,編寫如下 use std thread sleep use std time duration fn ...

Rust中變數的複製與Copy trait

示例程式 fn main y x,y 輸出 x 123,y 123 上述程式中,在建立變數 y 之後,變數 x 繼續有效。而不會想 string 的賦值一樣發生移動 這是因為對於包括整型在內的一些型別來說,在編譯時可以得知自己的大小,並且能夠將自己的資料完整地儲存在棧記憶體中。因為資料的拷貝全部發生...