但是,本文不涉及原理性介紹,請自行搜尋。
執行緒安全的引用計數器,arc
代表atomaticlly reference counted
/ 原子引用計數。
該型別arc
提供t在堆中分配的type值的共享所有權。呼叫clone將arc產生乙個新arc例項,該例項指向堆上與源相同的分配arc,同時增加引用計數。當arc 指向給定分配的最後乙個指標被破壞時,儲存在該分配中的值(通常稱為「內部值」)也會被刪除。
預設情況下,rust中的共享引用不允許更改,arc
也不例外:您通常無法獲得對內某些內容的可變引用arc。如果通過需要發生變異arc,使用mutex
,rwlock
或者乙個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 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...