今天來講講并發編程常用術語的通俗解釋
并發
同時做多件事情。
這個解釋直接表明了并發的目的,例如編寫客戶端程序,在后臺查詢數據庫數據時,需要對用戶的輸入請求進行響應;在編寫服務的程序時,可以同時響應多個用戶的請求。
可以說只要產品需要同時做多件事情,那么就需要并發。
通俗地講,程序能夠同時處理多個任務就稱為并發。
在談論并發的時候,有的朋友總會想起多線程,這里有必要聲明一下,并發包含多線程,多線程是并發的一種實現方式。
并行
把正在運行的多個任務,分割成小塊,分配給多個線程同時運行。
現代計算機一般都是多核的,把所有任務只交給一個核顯然是不合理的。
舉例來說,如果計算機是4核的,有4個任務要同時執行,則每個核跑一個任務。
同步&異步
同步,按順序執行,發起請求后,需要等待結果返回后才返回。
而對于線程間同步,線程的運行順序并不是有序的,它是由操作系統進行管理的,想要數據保持一致,線程必須掛起并等待其他線程執行完畢。
例如,如果兩個線程試圖同時寫入同一個變量,結果是不可知的,所以必須使用同步。而實現同步的方式可以用互斥量。
異步,不按順序執行,發起請求后,可以立即返回,不需要等待結果返回后才返回。
以下是關于多線程的一些術語解釋
高級接口&低級接口
在C++標準庫、Qt或其它語言的標準庫都提供了并行開發的高級接口,我們應盡量避免使用低級接口,使用高級接口可以很方便的處理并行開發,且上手簡單,邏輯清晰,性能高效。
高級接口一般有像標準庫中的future、promise,Qt中的QFuture、QFutureWatcher等。低級接口有thread、QThread、QRunnable、QMutex等。
如果你還在使用低級接口,若不是什么必需條件,那最好切換使用高級接口吧。
線程安全
線程調用函數,如果這個函數只修改局部變量,或是有序修改共享區數據,則我們說這個函數就是線程安全的。如果是類中的方法,我們就說這個類是線程安全的。
多線程之所以復雜,是因為要同時訪問或修改共享資源,所以可以認為如果函數不對共享資源操作,或安全操作,則該函數是線程安全的。
互斥量
當多個線程同時訪問公共資源時,可以使用互斥量,誰先搶到鎖,誰就可以訪問公共資源,待鎖釋放后,其他線程才可以再次搶鎖。
下圖是A先獲得了鎖進入房間,BCD都必須在門外等候,只有A從房間出來,釋放鎖后,BCD才可以重新搶占。
互斥量
7信號量
信號量是更一般化的互斥量。一個互斥量只能被鎖定一次,但是一個信號量可以被鎖住多次。信號量通常用于保護一定數量的相同資源。
電影院選座
信號量的一個很好的例子是電影院選座。
- 一個信號量被初始化為電影院里的座位數量,如上圖為5個座位數。
- 第1個人獲取座位數1(可用信號量個數變為4),成功(黃色)
- 第2個人獲取座位數2(可用信號量個數變為2),成功(藍色)
- 第3個人獲取座位數3,失敗,因為可用的信號量已經剩余2個了。
- 如果第3個人想要獲取到3個座位,則必須等待其他人釋放掉信號量個數,可用的信號量數大于等于3才可以
信號量可以運用在餐廳訂座,車票訂座等場景
8 死鎖
兩個或兩個以上的線程,彼此競爭資源而造成的一種彼此阻塞的現象。
死鎖
藍色的鑰匙被鎖到箱子A中,黃色的鑰匙被鎖到箱子B中,出現死鎖
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.