在ARM嵌入式開發(fā)中,編譯器提供的C庫函數(shù)有一部分不是線程安全的。
如果項(xiàng)目中運(yùn)行了第三方RTOS,在調(diào)用標(biāo)準(zhǔn)C庫函數(shù)時(shí)就要關(guān)心它們是不是線程安全的。
比如printf函數(shù),它是可重入的函數(shù),但是在多線程環(huán)境下打印的內(nèi)容可能會(huì)交叉亂序。
當(dāng)然這種問題還不算嚴(yán)重。
但如果調(diào)用庫函數(shù)malloc,這個(gè)函數(shù)在RTOS環(huán)境下多線程調(diào)用則會(huì)引發(fā)堆數(shù)據(jù)結(jié)構(gòu)異常。
那么有沒有辦法讓C庫標(biāo)準(zhǔn)函數(shù)實(shí)現(xiàn)線程安全呢?
經(jīng)過查閱文檔,在KEIL/MDK中確實(shí)存在這么一種方法,可以實(shí)現(xiàn)malloc線程安全。
在KEIL/MDK的標(biāo)準(zhǔn)庫中提供了一組可重載的互斥鎖函數(shù),我們可以自行實(shí)現(xiàn)這一組函數(shù),來保證C庫函數(shù)線程安全。
函數(shù)原型和參考實(shí)現(xiàn)代碼如下:
//創(chuàng)建互斥鎖,成功返回1,失敗返回0
int _mutex_initialize(mutex *m)
{
*m = mutex_create(); /* 調(diào)用RTOS提供的函數(shù),創(chuàng)建鎖 */
return 1;
}
//獲取互斥鎖(加鎖操作)
void _mutex_acquire(mutex *m)
{
mutex_lock(*m); /* 調(diào)用RTOS提供的函數(shù),加鎖 */
}
//釋放互斥鎖(解鎖操作)
void _mutex_release(mutex *m)
{
mutex_unlock(*m); /* 調(diào)用RTOS提供的函數(shù),解鎖 */
}
//刪除互斥鎖
void _mutex_free(mutex *m)
{
mutex_delete(*m); /* 調(diào)用RTOS提供的函數(shù),刪除鎖 */
}
需要注意的是,重載以上互斥鎖函數(shù)后,要確保調(diào)用C庫函數(shù)的時(shí)機(jī)一定要晚于RTOS的初始化。
KEIL官方參考資料:
ARM編譯器:重載互斥鎖實(shí)現(xiàn)C庫函數(shù)線程安全
ARM編譯器:線程安全的C標(biāo)準(zhǔn)庫函數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-402257.html
ARM編譯器:線程不安全的C標(biāo)準(zhǔn)庫函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-402257.html
到了這里,關(guān)于KEIL/MDK中的標(biāo)準(zhǔn)C庫函數(shù)printf和malloc實(shí)現(xiàn)線程安全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!