信号量死锁表现就是系统卡死了,但是在多线程程序中并不是那么容易跟踪。
一种排查方法是
#define MODULE_LOCK(sem_handle) \
do{ \
bool cret; \
module_pwarning("lock in\n"); \
cret=os_acquire_sem(sem_handle,OS_WAIT_TIMEOUT_MAX);\
module_pwarning("lock out\n"); \
if(cret)\
{ \
module_perror("fail\n"); \
return ERR_ACQUIRE_SEM_FAIL; \
} \
}while(0)
这种方法不好的地方是死锁后并不显然知道哪个锁死锁了,需要猜哪个锁死锁,然后放开打印信息。放开锁的打印打印信息会非常多影响系统运行。
在项目实施过程中想到了另外一种思路,简单说就是将获取信号量者记录下来,当信号量死锁的时候将记录的访问者打印出来。
具体实施如下:
增加信号量管理结构
typedef struct
{
bool is_used;
u32 handle;
bool is_acquired; /*信号量是否被访问*/
const s8* acquired_func_record; /*访问者的方法*/
u32 acquired_func_line_record; /*访问者的行号*/
}os_sem_manage_t;
在os_acquire_sem声明