因死锁发生的线程卡死

调试时,发现如果 收到的modbus数据写入到文件功能打开,另一个进程连续快速的调用msgsnd函数发送 会导致无功补偿App收不到数据,用ipcs-a 能看到内存中的有很多条消息, 关闭打印到文件功能函数, 通信就正常了。
在消息发送函数 msgsnd(msg_fd,&gt_PipeMsg.rcvbuf[0], 13 ,IPC_NOWAIT)(发送线程中)
改成msgsnd(msg_fd,&gt_PipeMsg.rcvbuf[0], 13 ,0) 解决 ,但在帧解析线程报 frame time out,即 帧解析线程没有进行帧解析,这个线程发生了死锁。

    最主要的原因是发生了死锁,modbus监测帧数据的 定时器周期是1ms,当打开写文件到flash操作时, 还没有写完数据, 定时器的回调函数,再次调用 ,导致了程序卡在这里了 。  此时在定时器回调函数中如下修改,问题解决(当进入定时器的回调函数时,加上互斥锁)
int  lockret = pthread_mutex_trylock(&Mutex_Rs485);
            if(lockret == 0 )
            {
                modubus_FrameLen=gt_Uart1_Operation.UartModbusSlaveReadFromBuf(&Uart1ModbusOneFrameBuff[0]);            
                pthread_cond_signal(&Cond_t_Rs485);
                pthread_mutex_unlock(&Mutex_Rs485);
            }else 
            {
                 printf("timer_callback  happen dead lock \r\n");
                 return ; // 发生死锁后,直接返回 ,等待下次再进入
            }

猜你喜欢

转载自blog.csdn.net/tiger15605353603/article/details/81351755