ecos中的spl同步機制

2021-09-05 11:47:26 字數 1628 閱讀 4276

splimp

splnet

splclock

splsoftnet

splx

雖然看到有好幾種形式,但實際上splimp,splnet,splclock,splsoftnet都是呼叫的splany

一般在ecos的網路層見到,典型用法如下:

#define	mbuflock(code) do 							\

splx(_ms); \

} while (0)

先呼叫splimp(),中間是臨界區**,然後執行splx(x)。

先來看解鎖的部分

void

cyg_splx

(cyg_uint32 old_state splxmoreargs)

cyg_scheduler_unlock()

;}

第一次進來,程式流程很簡單,就是修改spl_state的值為which,spl_thread為自身,加上splx_mutex互斥鎖,返回0.

沒有調splx的情況下相同執行緒第二次進來,什麼都不做,返回which。

沒有調splx的情況下不同執行緒第二次進來,將會卡在互斥鎖上。

沒有遞迴調splany的情況下,splx執行完spl_state=0,釋放互斥鎖。

遞迴呼叫splany的情況下,前幾次的splx由於spl_state都不為0,,不會有實際動作,最後一次splx才會釋放互斥鎖

static

inline cyg_uint32

spl_any

( cyg_uint32 which )if(

cyg_thread_self()

!= splx_thread )

old_spl =0;

// free when we unlock this context

cyg_assert(0

== splx_thread,

"thread still owned");

cyg_assert(0

== spl_state,

"spl still set");

splx_thread =

cyg_thread_self()

;}cyg_assert

( splx_mutex.locked,

"spl_any: mutex not locked");

cyg_assert

((cyg_handle_t)splx_mutex.owner ==

cyg_thread_self()

,"spl_any: mutex not mine");

spl_state |

= which;

if(lock_stat ==1)

cyg_scheduler_unlock()

;return old_spl;

}

spl這套同步機制實質上就是互斥鎖機制,只是相比較下,互斥鎖不支援遞迴呼叫,而spl支援遞迴呼叫。spl使用起來也更加方便。

linux同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

MySQL 同步機制

innodb沒有使用作業系統同步機制,而是自己封裝,通過spin 自旋 和wait array 等待佇列 的設計提高效能 目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。用到swap atomic操作,將記憶體中...

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...