MutexLock?mutex;
void?foo()
{
mutex.lock();
//?do?something1
mutex.unlock();
}
void?bar()
{
mutex.lock();
//?do?something2
foo();
mutex.unlock();
}
上面的代碼反映了壹種問題:
a\foo()函數即有可能獨自調用也可能作為bar()函數中的子函數壹起調用;
b\do something1和do something2都有是要保護的臨界區.
上面簡單的情況下可以用代碼技巧避免死鎖。而對於如遞歸二叉樹排序的問題如果妳比較厲害好像也可以把遞歸函數寫成for循環的形式.但對於兩個函數來回調用的時候,就必須使用遞歸互斥信號量了.
參考文獻:線程同步之利器(1)——可遞歸鎖與非遞歸鎖網頁鏈接
需要註意的是,以上代碼值得是Linix.回到FreeRTOS,
遞歸互斥信號量就是用遞歸函數裏面有需要保護的變量時使用的.依然以如遞歸二叉樹排序為例.
但FreeRTOS遞歸互斥信號量沒辦法實現上文所說交叉調用.