你是否也被蒙在鼓里?暫停線程遠(yuǎn)不止是一條語(yǔ)句的事兒!
1.介紹
本以為暫停線程是一條語(yǔ)句的事,結(jié)果發(fā)現(xiàn)事情并沒(méi)有那么簡(jiǎn)單,而且我相信很多人都用錯(cuò)了,就是因?yàn)椴攘诉@么一個(gè)坑,所以準(zhǔn)備發(fā)這么一個(gè)帖子,讓后面的人少踩坑。
2.應(yīng)用場(chǎng)景
有三個(gè)線程,分別為A、B和C,把A線程比作是大腦,B和C線程分別是掃地和洗碗,首先處于空閑狀態(tài),大腦讓我去掃地,這時(shí)A線程中會(huì)開啟B線程,第一次開啟線程可以調(diào)用【rt_thread_startup】這個(gè)函數(shù),沒(méi)啥毛病,當(dāng)老婆大人讓我去洗碗,大腦瞬間做出反應(yīng)去洗碗,這時(shí)A線程會(huì)關(guān)閉B線程然后打開C線程,那么A線程關(guān)閉B線程是調(diào)用【rt_thread_suspend】這個(gè)函數(shù)嗎?看著沒(méi)啥問(wèn)題哦,但是里面存在很大的問(wèn)題!這里先不說(shuō),繼續(xù)往下走,當(dāng)洗完碗還得繼續(xù)掃地,讓A線程恢復(fù)B線程需要調(diào)用【rt_thread_resume】這個(gè)函數(shù)。
上面這個(gè)應(yīng)用場(chǎng)景就實(shí)現(xiàn)了,A線程暫停和恢復(fù)B線程,看著是沒(méi)什么問(wèn)題,我們先來(lái)實(shí)際操作一下,看看有什么問(wèn)題!
3.場(chǎng)景再現(xiàn)
硬件:STM32F407VET6RTThread版本:3.1.3Nano首先按照上面的應(yīng)用場(chǎng)景走一遍,設(shè)計(jì)三個(gè)線程,分別為A、B和C,然后開始運(yùn)行,具體代碼如下:
#include ALIGN(RT_ALIGN_SIZE)static rt_uint8_t a_thread_stack[ 512 ];ALIGN(RT_ALIGN_SIZE)static rt_uint8_t b_thread_stack[ 512 ];ALIGN(RT_ALIGN_SIZE)static rt_uint8_t c_thread_stack[ 512 ];static struct rt_thread a_thread;static struct rt_thread b_thread;static struct rt_thread c_thread;static void a_thread_entry(void *parameter){unsigned int count = 0;while (1) { count ;if(count == 10) { rt_kprintf("b start!\n"); rt_thread_startup( 





