Rust多執行緒下共享變數

2022-06-20 13:03:16 字數 2006 閱讀 6725

但是,本文不涉及原理性介紹,請自行搜尋。

執行緒安全的引用計數器,arc代表atomaticlly reference counted/ 原子引用計數。

該型別arc提供t在堆中分配的type值的共享所有權。呼叫clone將arc產生乙個新arc例項,該例項指向堆上與源相同的分配arc,同時增加引用計數。當arc 指向給定分配的最後乙個指標被破壞時,儲存在該分配中的值(通常稱為「內部值」)也會被刪除。

預設情況下,rust中的共享引用不允許更改,arc也不例外:您通常無法獲得對內某些內容的可變引用arc。如果通過需要發生變異arc,使用mutexrwlock或者乙個atomic型別。

多執行緒訪問共享不可變變數

use std::sync::;

use std::sync::atomic::;

use std::thread;

#[test]

pub fn test_immutable() ,values:{}", b1.as_ref(), b1);

});let t2 = thread::spawn(move || ,values:{}", b2.as_ref(), b2);

});println!("b,addr:,values:{}", b.as_ref(), b);

t2.join();

t1.join();

}

互斥器(mutex) 是mutual exlusion的縮寫,也就是說,任意時刻,其只允許乙個執行緒訪問某些資料。為了訪問互斥器中的資料,執行緒首先需要獲得互斥器的,來表明其希望訪問資料。

arc+mutex實現多執行緒下多所有權

use std::sync::;

use std::sync::atomic::;

use std::thread;

#[test]

pub fn test_mutable() ", i)).spawn(move || ,addr:,value{}", thread::current().name().unwrap(),b1.as_ref() ,*guard);

// guard 離開作用域後會自動釋放鎖

}).unwrap();

handles.push(handle);

}// 10個執行緒對b減1

for i in 0..10 ", i)).spawn(move || ,addr:,value{}", thread::current().name().unwrap(),b2.as_ref() ,*guard);

}).unwrap();

handles.push(handle);

}// for handle in handles

thread::sleep(duration::from_secs(1));

println!("b,addr:,values:{}", b.as_ref(), b.lock().unwrap());

}

arc+atomicusize 實現多執行緒下多所有權

use std::sync::;

use std::sync::atomic::;

use std::thread;

#[test]

fn test_mutable() ,", v, arc::::as_ptr(&val));

});handles.push(handle);

}for _ in 0..10 ,", v, arc::::as_ptr(&val));

});handles.push(handle);

}for handle in handles

println!("final,,", arc, arc::::as_ptr(&arc));

}

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...

多執行緒共享變數

題目如下 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。如果每個執行緒執行的 相同 可以使用同乙個runnable物件,這樣在不同的執行緒中只需要把這個runnable物件傳到裡面去即可,因為runnable物件的run方法天熱原子性,不可能run方法被打斷,乙個run...

多執行緒共享變數

from threading import thread,lock global num 0 def func1 global global num 全域性變數 for i in range 1000000 lock.acquire 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...