執行緒間同步之互斥量:
即執行緒a訪問鄰接資源時,阻止執行緒b訪問。互斥量(互斥鎖)保證兩個執行緒指令的先後順序執行。具有原子性(一系列操作不可以被中斷,不存在部分執行部分未執行的情況)。互斥鎖是最簡單的執行緒同步方法,有加鎖和解鎖兩種狀態,
兩個狀態可以保證資源訪問的序列。
同時,作業系統直接提供了互斥量的api,開發者可以直接使用api完成資源的加鎖、解鎖操作。
執行緒間同步之自旋鎖:
自旋鎖的原理和互斥鎖相同。使用自旋鎖的執行緒會反覆檢查鎖變數是否可用,自旋鎖不會讓出cpu,而是處於忙等待狀態(一直死迴圈等待cpu釋放)
優點:自旋鎖避免了程序或者上下文切換的開銷,同時作業系統本身很多地方都使用了自旋鎖。
但是自旋鎖不適合單核cpu。
自旋鎖和互斥鎖有什麼區別呢?
比如執行緒1呼叫執行緒2占有的臨界資源(執行緒2持有自旋鎖)那麼執行緒1會一直請求直到臨界資源釋放,而互斥鎖會讓執行緒1休眠,置入請求佇列中去。
執行緒間同步之讀寫鎖
在實際生產中,臨界資源往往面臨的情況是多讀少些,即讀時並不改變臨界資源的值。
讀寫鎖是一種特殊的自旋鎖
允許多個讀者同時訪問資源以提高讀效能
對於寫操作則是互斥的,即讀-寫互斥,寫-寫互斥,而對於讀-讀操作,不互斥。讀寫鎖對於多讀少寫的場景效能提公升非常大。
執行緒間同步之條件變數
條件變數是一種相對複雜的執行緒同步方法
條件變數允許執行緒睡眠,直到滿足某種條件
當滿足條件時,可以向該執行緒訊號,通知喚醒,往往配合互斥鎖使用。
使用fork系統呼叫建立程序。
fork系統呼叫是用於建立程序的
fork建立的程序初始化狀態與父程序一樣
系統會為fork的程序分配新的資源
fork函式沒有入參,會返回兩次,分別返回子程序id和0,返回子程序id的是父程序,返回0的是子程序。
程序間同步之共享記憶體
在某種程度上,多程序是共同使用物理記憶體的
由於作業系統的程序管理,程序間的記憶體空間是獨立的。並且程序預設是不能訪問程序空間之外的記憶體空間的。
共享儲存允許不相關的程序訪問同一片物理記憶體
共享記憶體是兩個程序之間共享和傳遞資料最快的方式
共享記憶體未提供同步機制(避免了併發問題),因此需要借助其他機制管理訪問
使用共享記憶體的四個步驟
unix之域內套接字(socket)
域套接字是一種高階的程序間通訊的方法
unix域套接字可以用於同一機器程序間通訊
unix系統提供的域套接字提供了網路套接字類似的功能
舉個例子:
server端建立,繫結,監聽套接字,接受並處理訊息,而client端建立,連線套接字並傳送訊息。
套接字提供了單機簡單可靠的程序通訊同步服務,但是缺點也很明顯,只能在單機使用,不能跨機器使用。
執行緒同步四種方法
執行緒同步的方法 1 wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的lock。2 sleep 使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼叫此方法要捕捉 interruptedexception異常。3 notify 喚醒乙個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並...
四種程序或執行緒同步互斥的控制方法
四種程序或執行緒同步互斥的控制方法 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。2 互斥量 為協調共同對乙個共享資源的單獨訪問而設計的。3 訊號量 為控制乙個具有有限數量使用者資源而設計。4 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。臨界區...
四種程序或執行緒同步互斥的控制方法
四種程序或執行緒同步互斥的控制方法 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。2 互斥量 為協調共同對乙個共享資源的單獨訪問而設計的。3 訊號量 為控制乙個具有有限數量使用者資源而設計。4 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。臨界區...