pthread 的坑

2019-07-12 19:17发布

为什么写这篇文章?

嵌入式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() 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。 从上述可知,mutex会帮助我们锁定一段逻辑区域的访问。但是,如果一个数据对象有多处调用的情况,我们需要根据实际情况,设计统一的接口。   上诉问题出现的原因 图片显示两个线程 左边是控制背光的程序,右边是低电的时候控制led灯闪烁的程序,当右边的程序持有互斥锁的时候,因为里面有休眠函数,导致左边pthreadmutex_lock获取互斥锁的时候发生阻塞,但是因为led线程里面有msleep函数,导致系统进行调度,调度之后有可能还是闪烁led灯的线程持有锁,导致控制背光的线程没有获取锁

热门文章