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