你是否也被蒙在鼓里?暫停線程遠(yuǎn)不止是一條語句的事兒!
1.介紹
本以為暫停線程是一條語句的事,結(jié)果發(fā)現(xiàn)事情并沒有那么簡單,而且我相信很多人都用錯(cuò)了,就是因?yàn)椴攘诉@么一個(gè)坑,所以準(zhǔn)備發(fā)這么一個(gè)帖子,讓后面的人少踩坑。
2.應(yīng)用場景
有三個(gè)線程,分別為A、B和C,把A線程比作是大腦,B和C線程分別是掃地和洗碗,首先處于空閑狀態(tài),大腦讓我去掃地,這時(shí)A線程中會(huì)開啟B線程,第一次開啟線程可以調(diào)用【rt_thread_startup】這個(gè)函數(shù),沒啥毛病,當(dāng)老婆大人讓我去洗碗,大腦瞬間做出反應(yīng)去洗碗,這時(shí)A線程會(huì)關(guān)閉B線程然后打開C線程,那么A線程關(guān)閉B線程是調(diào)用【rt_thread_suspend】這個(gè)函數(shù)嗎?看著沒啥問題哦,但是里面存在很大的問題!這里先不說,繼續(xù)往下走,當(dāng)洗完碗還得繼續(xù)掃地,讓A線程恢復(fù)B線程需要調(diào)用【rt_thread_resume】這個(gè)函數(shù)。
上面這個(gè)應(yīng)用場景就實(shí)現(xiàn)了,A線程暫停和恢復(fù)B線程,看著是沒什么問題,我們先來實(shí)際操作一下,看看有什么問題!
3.場景再現(xiàn)
硬件:STM32F407VET6RTThread版本:3.1.3Nano首先按照上面的應(yī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(