ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
C 標(biāo)準(zhǔn)假定只有一個(gè)執(zhí)行線程,唯一的例外是為信號(hào)處理程序提供有限的支持??芍厝胄詥?wèn)題通過(guò)禁止在信號(hào)處理程序中執(zhí)行任何操作來(lái)加以避免。不過(guò),SYS/BIOS 應(yīng)用程序具有多個(gè)線程,這些線程都需要修改相同的全局程序狀態(tài),例如 CIO 緩沖器,因此可重入性是個(gè)問(wèn)題。
可重入性問(wèn)題仍要由您自行負(fù)責(zé)解決,但運(yùn)行時(shí)支持環(huán)境確實(shí)通過(guò)為臨界區(qū)提供支持,從而對(duì)多線程的可重入性提供了基本的支持。這個(gè)實(shí)現(xiàn)方案并不能幫助您避免可重入性問(wèn)題,例如從內(nèi)部中斷調(diào)用運(yùn)行時(shí)支持函數(shù);這仍然是您的責(zé)任。
運(yùn)行時(shí)支持環(huán)境提供了鉤子程序來(lái)安裝臨界區(qū)基元。默認(rèn)情況下,假定使用單線程模型,并且不采用臨界區(qū)基元。在 SYS/BIOS 等多線程系統(tǒng)中,內(nèi)核會(huì)安排在這些鉤子程序中安裝信號(hào)量鎖基元函數(shù),然后在運(yùn)行時(shí)支持輸入需要由臨界區(qū)加以保護(hù)的代碼時(shí)調(diào)用這些函數(shù)。
在整個(gè)運(yùn)行時(shí)支持環(huán)境中,當(dāng)因訪問(wèn)全局狀態(tài)而需要由臨界區(qū)加以保護(hù)時(shí),會(huì)調(diào)用函數(shù) _lock()。此操作會(huì)調(diào)用提供的基元(若已安裝)并獲取信號(hào)量,然后再繼續(xù)。在臨界區(qū)完成后,會(huì)調(diào)用 _unlock() 來(lái)釋放信號(hào)量。
通常,SYS/BIOS 負(fù)責(zé)創(chuàng)建和安裝基元,因此您無(wú)需采取任何操作。不過(guò),這種機(jī)制可以在不使用 SYS/BIOS 鎖定機(jī)制的多線程應(yīng)用程序中使用。
您不應(yīng)直接定義 _lock() 和 _unlock() 函數(shù);相反,通過(guò)調(diào)用安裝函數(shù)來(lái)指示運(yùn)行時(shí)支持環(huán)境使用以下基元:
void _register_lock (void ( *lock)());
void _register_unlock(void (*unlock)());_register_lock() 和 _register_unlock() 的參數(shù)應(yīng)為無(wú)參數(shù)且不返回任何值的函數(shù),此類函數(shù)會(huì)實(shí)現(xiàn)某種全局信號(hào)量鎖定:
extern volatile sig_atomic_t *sema = SHARED_SEMAPHORE_LOCATION;
static int sema_depth = 0;
static void my_lock(void)
{
while (ATOMIC_TEST_AND_SET(sema, MY_UNIQUE_ID) != MY_UNIQUE_ID);
sema_depth++;
}
static void my_unlock(void)
{
if (!--sema_depth) ATOMIC_CLEAR(sema);
}運(yùn)行時(shí)支持會(huì)對(duì) _lock() 的調(diào)用進(jìn)行嵌套,因此基元必須跟蹤嵌套級(jí)別。