如果邏輯控制流在時(shí)間上重疊,那么它們就是并發(fā)的。
現(xiàn)代操作系統(tǒng)提供了三種基本的構(gòu)造并發(fā)程序的方法:
- 進(jìn)程,每個(gè)邏輯控制流都是一個(gè)進(jìn)程,由內(nèi)核調(diào)度和維護(hù),進(jìn)程有獨(dú)立的虛擬地址空間,要想共享數(shù)據(jù),必須顯示的IPC機(jī)制
- I/O多路復(fù)用,應(yīng)用程序在一個(gè)進(jìn)程的上下文中顯示地調(diào)度它們自己的邏輯流,因?yàn)槌绦蚴且粋€(gè)單獨(dú)的進(jìn)程,所有的流共享同一個(gè)地址空間
- 線程,由內(nèi)核進(jìn)行調(diào)度,可以看做是以上兩種方式的混合體
線程安全
當(dāng)一個(gè)函數(shù)被多個(gè)線程反復(fù)地調(diào)用時(shí),它會(huì)一直產(chǎn)生正確的結(jié)果,這個(gè)函數(shù)是線程安全的。反之,該函數(shù)是線程不安全的。
- 四個(gè)線程不安全函數(shù)類:
1、不保護(hù)共享變量的函數(shù)
2、保持跨越多個(gè)調(diào)用的狀態(tài)的函數(shù)
3、返回指向靜態(tài)變量的指針的函數(shù)
4、調(diào)用線程不安全函數(shù)的函數(shù)
線程安全函數(shù):
可重入函數(shù):當(dāng)它們被多個(gè)線程調(diào)用時(shí),不會(huì)引用任何共享數(shù)據(jù)。死鎖:一組線程被阻塞了,等待一個(gè)永遠(yuǎn)不可能為真的條件。
規(guī)避死鎖:給定所有互斥操作的一個(gè)全序,如果每個(gè)線程都是以一種順序獲得互斥鎖并以相反的順序釋放,那么這個(gè)程序就是無(wú)死鎖的。