我在基于C的应用程序中遇到一个问题,由于某些未知原因,VxWorks TASK(例如Task1)之一崩溃了。崩溃的任务锁定了互斥信号灯(例如semA)。
现在,下一个TASK2正在等待semA解锁。由于semA被崩溃的TASK锁定,因此TASK2将无限期等待获取semA。这破坏了应用程序功能。

我们无法提供超时来将semA锁定在TASK2中,因为semA正在保护通过套接字发送数据的发送路由。提供超时将导致消息通信失败。

谷歌搜索之后,我发现了针对此类问题的LINUX鲁棒互斥体,但我们的平台是VxWorks(版本5.5.1)。
那么有人可以告诉我在VxWorks中解决此问题的方法吗?

我尝试了以下提到的解决方案,但不确定这样做是否安全。

1)TASK2将在semA上等待特定的定时
2)如果失败,请检查已锁定semA的先前任务的状态
3如果TASK1状态为SUSPENDED,则TASK 2将在semA上调用semDelete,然后重新创建它。
4)如果TASK1不处于SUSPENDED状态,请继续等待获取semA。

我已经将此代码作为原型(prototype)进行了测试,并且工作正常。我不确定在重新创建信号量时实施这种解决方案的效果如何,以及可能带来的风险。

请让我知道您的输入。

谢谢

最佳答案

我认为您的原型(prototype)解决方案不再具有使代码(任务1)由于未知原因而崩溃的风险。

如果我要解决您的问题,我首先会非常努力地找出Task1崩溃的原因。如果我无法找出根本原因,那么我将去实施您建议的解决方案。也就是说,我将在一定时间后查询Task2的状态,然后重新创建信号灯。

关于crash - VxWorks互斥信号灯被崩溃的任务锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26460447/

10-11 16:03