1. 線程同步有哪幾種方式
有5個基本的同步機制,互斥量、讀寫鎖、條件變量、自旋鎖和屏障
- 互斥量的本質(zhì)就是一把鎖,在訪問共享資源前對互斥量進行設(shè)置(加鎖),在訪問完成后釋放(解鎖)互斥量。對互斥量加鎖以后,任何其他試圖再次對互斥量加鎖的線程都會被阻塞知道線程釋放該互斥量。
- 讀寫鎖和互斥量類似,不過讀寫鎖允許更高的并行性?;コ饬坑袃煞N狀態(tài),要么加鎖,要么解鎖,而且兩種狀態(tài)一次只能有一個線程進行訪問。讀寫鎖有3中狀態(tài),讀模式下加鎖,寫模式下加鎖,不加鎖裝填。一次只能有一個線程可以占有寫模式下的讀寫鎖,但是有多個進程可以同時占有寫模式下的讀寫鎖
- 條件變量給多個線程提供了一個會合的場所。條件變量的使用是需要結(jié)合鎖機制的,一個進程/線程要等到臨界區(qū)的共享數(shù)據(jù)達到某種狀態(tài)時再進行某種操作,而這個狀態(tài)的成立,則是由另外一個進程/線程來完成后發(fā)送信號來通知的。
- 自旋鎖和互斥量類似,但是它不是通過休眠使線程阻塞,而是在獲得鎖之前一直處于忙等(自旋)阻塞狀態(tài)。
- 屏障是協(xié)調(diào)多個線程并行工作的同步機制。屏障允許每個線程等待,知道所有合作的線程都到達某一個點時,然后從該點繼續(xù)執(zhí)行。
本文來自 poison_biti 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/poison_biti/article/details/76665050?utm_source=copy
2. 線程通信有哪些手段?
- 全局數(shù)據(jù);2. 全局變量;3. 全局數(shù)據(jù)結(jié)構(gòu)
- 線程間通信的參數(shù):調(diào)用線程時,可以指定傳入的函數(shù),同時傳入了這個函數(shù)的參數(shù),參數(shù)不止一個時傳入保存參數(shù)的結(jié)構(gòu)。
- 文件句柄:可以讀寫某個文件
線程同時訪問共享資源時,需要同步
3.volatile
volatile只保證其“可見性”,不保證其“原子性”。
(1)將 count 的值從內(nèi)存加載到 cpu 的某個 寄存器r;
(2)將 寄存器r 的值 +1,結(jié)果存放在 寄存器s;
(3)將 寄存器s 中的值寫回內(nèi)存。
- 在沒有volatile的時候,執(zhí)行完count++,執(zhí)行結(jié)果其實是寫到CPU緩存中,沒有馬上寫回到內(nèi)存中,后續(xù)在某些情況下(比如CPU緩存不夠用)再將CPU緩存中的值flush到內(nèi)存。因為沒有存到內(nèi)存里,其他線程是不能及時看到執(zhí)行結(jié)果的。
- 在有volatile的時候,執(zhí)行完count++,執(zhí)行結(jié)果寫入緩存中,并同時寫入內(nèi)存中,所以可以保證其它線程馬上看到執(zhí)行的結(jié)果。
volatile 并沒有保證原子性,在某個線程執(zhí)行(1)(2)(3)的時候,volatile 并沒有鎖定 count 的值,也就是并不能阻塞其他線程也執(zhí)行(1)(2)(3)??赡苡袃蓚€線程同時執(zhí)行(1),所以(2)計算出來一樣的結(jié)果,然后(3)存回的也是同一個值。
4. 多線程和多進程的區(qū)別
多線程:同一時刻執(zhí)行多個線程。
多進程:同時執(zhí)行多個程序。
進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位;一個進程可以有多個線程,一個線程只能屬于一個進程。
區(qū)別:
1.線程與資源分配無關(guān),它屬于某一個進程,并與進程內(nèi)的其他線程一起共享進程的資源。
2.每個進程都有自己一套獨立的資源(數(shù)據(jù)),供其內(nèi)的所有線程共享。
3.不論是大小,開銷線程要更“輕量級”
4.一個進程內(nèi)的線程通信比進程之間的通信更快速,有效。(因為共享變量)
5. 線程為什么調(diào)度比進程快
- 使用相同的地址空間,共享大部分數(shù)據(jù),啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。
- 線程間方便的通信機制,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便;
- 多線程高效利用了CPU多核的特點,CPU使用效率高。
6.
本文來自 SSIrreplaceable 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/SSIrreplaceable/article/details/53171706?utm_source=copy
本文來自 SSIrreplaceable 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/SSIrreplaceable/article/details/53171706?utm_source=copy