生活中的例子:
洗菜必須在買菜之後, 做菜必須在洗菜之後, 吃飯必須在做菜之後.
軟體上的概念:
指的是散落在不同執行緒/程序中的**片段, 他們的執行順序必須是有序, 因為b**片段的執行依賴著a**片段的結果, 同理c**片段的執行依賴著b**片段的結果.
那麼, 怎麼實現abc的有序執行呢? 這就是同步的任務. 同步用於保證這幾個**片段的執行是有序的.
生活中的例子:
同一時間, 茅坑(馬桶)只能有乙個人蹲著, 人在進入廁所時會把門鎖上, 在上乙個人沒有出來前, 其他人沒辦法進去. 這就是互斥.如果你一定要用這個廁所, 但是發現廁所已經被其他人使用著, 根據你的反應, 存在兩種情況:
在門口等, 等上乙個人使用完立刻進去; 這個叫阻塞, 期間你沒辦法做任何事;
過一會再回來看看是否可以上廁所, 這個叫非阻塞, 期間你可以做其他事情, 例如給阿姨倒一杯卡布奇洛.
軟體上的概念:
針對系統的某些資源, 同一時間內只允許乙個程序/執行緒進行訪問, 當資源被占用時, 其它程序/執行緒不得占用, 這就是互斥. 當有乙個程序/執行緒, 需要訪問該資源, 而該資源被其它程序/執行緒占用時, 有存在兩種情況:
程序/執行緒原地等待(自旋等待/睡眠等待), 期間不會做其它事情, 直到獲取到該資源. 這個就是阻塞;
程序/執行緒先去做其他事情, 等會再次查詢該資源是否可用, 這個就是非阻塞.
個人觀點: 同步互斥更像一種兄弟關係, 沒必要分誰是誰的什麼, 但是兩者通常一起出現.
買菜->洗菜->做菜->吃飯, 這個流程中必須保持同步(有序進行), 但是過程中並不互斥, 哪乙個地方, 都可以插入多個人, 但是菜同一時間可能只有乙個人碰. 同步中存在著互斥.
上廁所為例子, 你必須先鎖上門, 然後才開始上廁所. 互斥中存在著同步.
**也源於生活, 不是嗎?
4.1 應用層
int fd =
open
("/dev/yangbkdevice"
, o_rdwr | o_nonblock)
;// 非阻塞方式開啟檔案, 預設是阻塞
int ret =
read
(fd,
&value,4)
;
4.2 驅動層
使用原子變數: (同一時間內只有乙個程序/執行緒可以修改它的值, 通過這個變數的數值改變來進行判斷, 在原子變數改變的前後只有乙個程序/執行緒訪問這段**/資源)
//定義原子變數並初始化為1
static atomic_t canopen =
atomic_init(1
);// 在驅動的open()函式中, 當需要執行臨界區的**/訪問敏感資源時, 試圖修改原子變數以試圖得到許可權.
/** * atomic_dec_and_test - decrement and test
* @v: pointer of type atomic_t
* * atomically decrements @v by 1 and
* returns true if the result is 0, or false for all other
* cases.
*/if(!
atomic_dec_and_test
(&canopen)
)// 操作/資源訪問完成時, 釋放許可權.
atomic_inc
(&canopen)
;
使用互斥鎖:
//定義互斥鎖
static
declare_mutex
(button_lock)
;// 在驅動的open()函式中
static
intbtn_open
(struct inode *inode,
struct file *file)
else
}tips: 在驅動的read
()函式中, 也需要判斷fd是否以非阻塞方式開啟, 也需要遵循o_nonblock
// 釋放互斥鎖up(
&button_lock)
;
同步與互斥只是乙個概念, 需要程式設計師去遵循的規則, 以防止程式跑飛. linux 同步 互斥 概念
相交程序之間的關係主要有兩種,同步與互斥。所謂互斥,是指散步在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它 們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。所謂同步,是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後...
Linux 互斥與同步
使用互斥鎖之前必須要建立乙個鎖的物件。互斥鎖的型別為pthread mutex t,建立乙個變數就是建立了乙個互斥鎖,我們通過這個變數建立開鎖和解鎖的聯絡。但這個鎖還不能夠直接使用,需要對其進行初始化。我們對建立好的鎖進行初始化的方法有兩種 第二個引數attr 如果傳入null,互斥鎖的屬性設定為預...
Linux中的同步技術之互斥量
互斥量從本質上說就像是一把鎖,提供資源的保護訪問,互斥量有兩種狀態,鎖住 lock 與解鎖狀態 unlock 用來保證一段時間內只有乙個執行緒使用該共享資源。互斥量的資料型別為pthread mutex t,如果互斥鎖變數是靜態分配的,那麼一般將其初始化為常值pthread mutex initia...