【2017-06-20】Linux應用開發工程師C/C++面試問題記錄之一:Linux多線程程序的同步問題


參考之一:Linux 線程同步的三種方法

鏈接地址:http://www.cnblogs.com/eleclsc/p/5838790.html

簡要回答:

Linux下線程同步最常用的三種方法就是互斥鎖、條件變量及信號量。

互斥鎖通過鎖機制來實現線程間的同步,鎖機制是同一時刻只允許一個線程執行一個關鍵部分的代碼。

條件變量是用來等待而不是用來上鎖的,條用來自動阻塞一個線程,直到某特殊情況發生為止,通常條件變量和互斥鎖同時使用。

線程的信號量與進程間通信中使用的信號量的概念是一樣,它是一種特殊的變量,它可以被增加或減少,但對其的關鍵訪問被保證是原子操作,如果一個程序中有多個線程試圖改變一個信號量的值,系統將保證所有的操作都將依次進行。

信號量最常用的就是二值信號量,及只能有0與1兩個值,有時候也叫單值信號量。

但有一個問題,線程同步時如何選擇信號量或互斥鎖?

這里百度到一個關於互斥鎖和信號量的區別:

1. 互斥鎖用於線程的互斥,信號量用於線程的同步;

這是兩者的根本區別,也就是互斥和同步的區別

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性,但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。 

同步:是指在互斥的基礎上,這是大多數情況,通過其它機制實現訪問者對資源的有序訪問。

在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的,少數情況是指可以允許多個訪問者同時訪問資源。

2. 互斥量值只能為0/1,信號量值可以為非負整數。  

也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多線程互斥問題。

信號量可以實現多個同類資源的多線程互斥和同步。

當信號量為單值信號量時,也可以完成一個資源的互斥訪問。

3. 互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM