为什么写这篇文章?
嵌入式Linux:pthread_create 记录线程使用zhuanlan.zhihu.com
这是上篇文章使用了pthread_create来实现闪烁led灯,因为代码写的有偏差导致了一个问题,就是不能进入深度休眠
问题产生原因
先了解下互斥锁
线程之间可以共享内存空间,这意味着不同线程可以访问内存中的同一个变量。然而不同线程在同一时间修改一个内存对象会造成一些不可预知的结果。
为了避免意外,我们需要用到pthread里一个非常重要的数据结构 —— 互斥对象(mutex)。互斥对象在使用时结合互斥锁使用,pthread_mutex_lock 和 pthread_mutex_unlock。
互斥锁是这样工作的:线程B锁定了一个互斥对象(mymutex),如果线程A也试图锁定该互斥对象(mymutex)时,线程A就进入休眠状态。一旦线程B释放了互斥对象(调用 pthread_mutex_unlock()) ,线程A 就能够锁定这个互斥对象(换句话说,线程A就将从 pthread_mutex_lock() 函数调用中返回,同时互斥对象被重新锁定)。同样地,当线程A正锁定互斥对象时,如果线程C试图锁定互斥对象的话,线程C也将临时进入睡眠状态。
pthread_mutex_lock(&mymutex);/*直至解锁后,mymutex会阻止另一个试图访问此区域的线程*/
pthread_mutex_unlock(&mymutex);
对已锁定的互斥对象上调用 pthread_mutex_lock() 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。
从上述可知,mute