LINUX c 併發同步

2021-07-22 18:18:53 字數 1654 閱讀 8155

5.1 核心同步與死鎖問題

併發:兩個程序可以真正的在臨界區中同時執行。

原因:(1)中斷

(2)軟中斷和tasklet

(3)核心搶占

(4)睡眠及與使用者空間的同步

(5)對稱多處理

資料加鎖:

(1)如果有其他執行執行緒可以訪問這些資料;

(2)如果任何其他什麼東西都能看見它;

(3)幾乎訪問所有的核心全域性變數和共享資料都需要某種形式的同步方  法。

死鎖產生原因:

(1)使用不可剝奪裝置;

(2)程序在已經占有乙個裝置的基礎上又提出新的裝置,而該新裝置又

被其他程序占有了,導致程序執行暫停;

(3)程序之間連環等待資源,如a等b,b等c,c等a。

避免死鎖的方法:

(1)按順序加鎖,如果有兩個或多個鎖曾在同一時間裡被請求,那麼以          

後其他函式請求它們時也必須按照前次加鎖的順序加鎖。

(2)防止發生飢餓,也就是**要保證能結束。

(3)不要重複請求同乙個鎖。

(4)所以程序在開始執行前,申請需要占用的全部裝置,防止中途因申

請不到而暫停。

(5)在程序申請不到繼續執行鎖需要的裝置時,必須釋放已經占用的資源。

5.2 解決併發同步的方法

1.原子操作

核心提供兩組原子操作介面:乙個針對整數,乙個針對位進行操作。

2.自旋鎖

自旋鎖的作用是在短期內進行輕量級加鎖,持有自旋鎖的事件最好小於

兩次上下文切換的耗時,且加鎖時間不長,,**不會睡眠。

3.自旋鎖與下半部的問題

由於下半部(或中斷)可以搶占程序上下文中的**,所以當下半部(或

中斷)和程序上下文共享資料時,必須對程序上下文中的共享資料進行

保護,需要加鎖的同時還要禁止下半部(或中斷)的執行。

4.訊號量

訊號量適用於鎖被長時間持有的情況,持有訊號量的**可以被搶占,

也可以在持有訊號量時去睡眠,但是當占用訊號量時不能同時占有自旋

鎖,因為在等待訊號量時可能會睡眠,而在持有自旋鎖時是不允許睡眠 的。

5.互斥體

互斥體是更簡單的睡眠鎖,只適用於:

(1)任何時候只有乙個任務可以持有mutex;

(2)給mutex上鎖者必須負責給其解鎖,也就是不能在乙個上下文中鎖

定乙個mutex,而在另乙個上下文中給它解鎖。

(3)當持有mutex時,程序不可以退出;

(4)mutex不能在中斷或者下半部中使用。

訊號量與互斥體比較:

(2)除非mutex的某個約束妨礙你使用,否則相比訊號量要優先使用mutex。

(2)當寫新**時,只有碰到特殊場合(一般是很底層的**)才會需

要使用訊號量。

自旋鎖和互斥體比較:

(1)在中斷上下文只能使用自旋鎖

(2)在任務睡眠時只有使用互斥體

(3)長期加鎖,優先使用互斥體

(4)短期加鎖,優先使用自旋鎖

6.完成量

如果在核心中乙個任務需要發出訊號通知另乙個任務發生了某個特定事

件,利用完成量是使兩任務得以同步的簡單方法。

7.禁止搶占

核心搶占**使用自旋鎖作為非搶占區域的標記,如果乙個自旋鎖被

持有,核心便不能進行搶占。

Linux C併發控制

linux執行緒介面也稱為pthread或posix執行緒,linux2.6以後,採用native posix執行緒庫的新執行緒實現。1,互斥量 標頭檔案pthread mutex t mtx pthread mutex initializer 靜態分配 pthread mutex t mtx pt...

併發程式設計(4)同步併發操作

一 主要涉及 等待事件 帶有期望的等待一次性事件 在限定時間內等待 使用同步操作簡化 二 等待乙個條件或者事件 1 選擇是在等待執行緒在檢查間隙,使用 std this thread sleep for 進行週期性的間歇 2 也是優先的選擇 是,使用c 標準庫提供的工具去等待事件的發生。通過另一線程...

linux c使用互斥鎖實現同步

1.需要使用到的庫pthread.h 2.需要使用到的函式有pthread mutex init,pthread mutex destory,pthread mutex lock,pthread unlock,3.需要保護的資料結構為 typedef struct cnt sum cnt sum兩個...