你是否也被蒙在鼓里?暂停线程远不止是一条语句的事儿!
时间:2021-11-01 14:15:38
[导读]1.介绍本以为暂停线程是一条语句的事,结果发现事情并没有那么简单,而且我相信很多人都用错了,就是因为踩了这么一个坑,所以准备发这么一个帖子,让后面的人少踩坑。2.应用场景有三个线程,分别为A、B和C,把A线程比作是大脑,B和C线程分别是扫地和洗碗,首先处于空闲状态,大脑让我去扫地...
1.介绍
本以为暂停线程是一条语句的事,结果发现事情并没有那么简单,而且我相信很多人都用错了,就是因为踩了这么一个坑,所以准备发这么一个帖子,让后面的人少踩坑。
2.应用场景
有三个线程,分别为A、B和C,把A线程比作是大脑,B和C线程分别是扫地和洗碗,首先处于空闲状态,大脑让我去扫地,这时A线程中会开启B线程,第一次开启线程可以调用【rt_thread_startup】这个函数,没啥毛病,当老婆大人让我去洗碗,大脑瞬间做出反应去洗碗,这时A线程会关闭B线程然后打开C线程,那么A线程关闭B线程是调用【rt_thread_suspend】这个函数吗?看着没啥问题哦,但是里面存在很大的问题!这里先不说,继续往下走,当洗完碗还得继续扫地,让A线程恢复B线程需要调用【rt_thread_resume】这个函数。
上面这个应用场景就实现了,A线程暂停和恢复B线程,看着是没什么问题,我们先来实际操作一下,看看有什么问题!
3.场景再现
硬件:STM32F407VET6RTThread版本:3.1.3Nano首先按照上面的应用场景走一遍,设计三个线程,分别为A、B和C,然后开始运行,具体代码如下:
#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( 





