1. 程式人生 > 其它 >用http 的形式訪問ftp伺服器上的圖片檔案

用http 的形式訪問ftp伺服器上的圖片檔案

原子操作

  ATOMIC_INIT(int i)定義原子變數的時候對其初始化。

  原子位操作不像原子整形變數那樣有個atomic_t 的資料結構,原子位操作時直接對記憶體進行的操作void set_bit(int nr, void *p) 將 p 地址的第 nr 位置 1。

自旋鎖  spinlock_t 表示自旋鎖

   1.用於多核SMP, 臨界區不能太大

   2.要注意死鎖現象的發生 (執行緒與執行緒)

  對於自旋鎖而言,如果自選鎖正在被執行緒A持有,執行緒B想要獲取自旋鎖,那麼執行緒B就會處於忙迴圈-旋轉-等待狀態,執行緒B不會進入休眠或者說去做其他的處理,一直等待鎖可以利用。

  自旋鎖 在執行期間會自動禁止搶佔功能,當執行緒A在獲得自旋鎖的期間進入休眠狀態,那麼執行緒A會自動放棄CPU的使用權,執行緒B開始執行,執行緒B也想要獲取鎖,但是此時鎖被A執行緒持有,而且核心還被禁止了搶佔功能,執行緒b無法被排程出。此時就發生了死鎖。

  3.要注意死鎖現象的發生 (執行緒與中斷)

  關閉本地中斷 ,中斷可以打斷自旋鎖。 (也就是降低中斷優先順序)

  注意事項:  

  ①、因為在等待自旋鎖的時候處於“自旋”狀態,因此鎖的持有時間不能太長,一定要 短,否則的話會降低系統性能。如果臨界區比較大,執行時間比較長的話要選擇其他的併發處 理方式,比如稍後要講的訊號量和互斥體。

   ②、自旋鎖保護的臨界區內不能呼叫任何可能導致執行緒休眠的 API 函式,否則的話可能 導致死鎖。

   ③、不能遞迴申請自旋鎖,因為一旦通過遞迴的方式申請一個你正在持有的鎖,那麼你就 必須“自旋”,等待鎖被釋放,然而你正處於“自旋”狀態,根本沒法釋放鎖。結果就是自己 把自己鎖死了!

   ④、在編寫驅動程式的時候我們必須考慮到驅動的可移植性,因此不管你用的是單核的還 是多核的 SOC,都將其當做多核 SOC 來編寫驅動程式。

  DEFINE_SPINLOCK(spinlock_t lock) 定義並初始化一個自選變數。

  spinlock_t lock; //定義自旋鎖(宣告一個自旋鎖變數)

  int spin_lock_init(spinlock_t *lock) 初始化自旋鎖。

  void spin_lock(spinlock_t *lock) 獲取指定的自旋鎖,也叫做加鎖。

  void spin_unlock(spinlock_t *lock) 釋放指定的自旋鎖。

   int spin_trylock(spinlock_t *lock) 嘗試獲取指定的自旋鎖,如果沒有獲取到就返回 0

  int spin_is_locked(spinlock_t *lock) 檢查指定的自旋鎖是否被獲取,如果沒有被獲取就 返回非 0,否則返回 0。

  自旋鎖API函式適用於SMP或支援搶佔的單CPU下執行緒之間的併發訪問, 也就是用於執行緒與執行緒之間,被自旋鎖保護的臨界區一定不能呼叫任何能夠引起睡眠和阻塞的 API 函式,否則的話會可能會導致死鎖現象的發生。

  讀寫鎖

  順序鎖

訊號量

  訊號量可以使等待資源執行緒進入休眠狀態,因此適用於那些佔資源比較久的場合。

  訊號量不能用於中斷中,因為訊號量會引起休眠,中斷不能休眠

  如果共享資源的持有時間比較短,那就不適合使用訊號量了,因為頻繁的休眠、切換執行緒引起的開銷要遠大於訊號量帶來的那點優勢。

  DEFINE_SEAMPHORE(name) 定義一個訊號量,並且設定訊號量的值為 1。 void sema_init(struct semaphore *sem, int val) 初始化訊號量 sem,設定訊號量值為 val。 void down(struct semaphore *sem) 獲取訊號量,因為會導致休眠,因此不能在中 斷中使用。 int down_trylock(struct semaphore *sem); 嘗試獲取訊號量,如果能獲取到訊號量就獲 取,並且返回 0。如果不能就返回非 0,並且 不會進入休眠。 int down_interruptible(struct semaphore *sem) 獲取訊號量,和 down 類似,只是使用 down 進 入休眠狀態的執行緒不能被訊號打斷。而使用此 函式進入休眠以後是可以被訊號打斷的。 void up(struct semaphore *sem) 釋放訊號量 表 47.4.2.1 訊號量 API 函式

互斥量

  mutex 可以導致休眠,因此不能在中斷中使用mutex,中斷中只能使用自旋鎖。

  和訊號量一樣,mutex保護的臨界區可以呼叫引起阻塞的API函式,

  因為一次只有一個執行緒可以持有mutex,因此 必須由mutex的持有者釋放mutex。並且mutex不能遞迴上鎖和解鎖。

  DEFINE_MUTEX(name) 定義並初始化一個 mutex 變數。 void mutex_init(mutex *lock) 初始化 mutex。 void mutex_lock(struct mutex *lock) 獲取 mutex,也就是給 mutex 上鎖。如果獲 取不到就進休眠。 void mutex_unlock(struct mutex *lock) 釋放 mutex,也就給 mutex 解鎖。 int mutex_trylock(struct mutex *lock) 嘗試獲取 mutex,如果成功就返回 1,如果失 敗就返回 0。 int mutex_is_locked(struct mutex *lock) 判斷 mutex 是否被獲取,如果是的話就返回 1,否則返回 0。 int mutex_lock_interruptible(struct mutex *lock) 使用此函式獲取訊號量失敗進入休眠以後可 以被訊號打斷。