有没有办法锁定互斥锁并让它在给定时间后自动解锁?

时间:2013-01-18 11:50:11

标签: c linux posix real-time mutex

这是在Linux上,但理想情况下我想要一个符合POSIX标准的解决方案。

我有两个线程,每个线程都可以通过API函数写入硬件总线。在任何给定时间只允许一个线程写入总线,并且在总线写入之后,不得在大约几百毫秒的给定时间内写入总线。

两个线程都实现为状态机。

显而易见的解决方案是使用互斥锁序列化对总线的访问,设置计数器或时间戳,并让状态机在适当的时间到期后解锁互斥锁。

这对我来说似乎有点脆弱。如果未来的维护开发人员错误地修改了状态机,则互斥锁可能不会被释放,从而导致难以诊断的死锁。

是否存在锁定互斥锁的API调用,但在给定超时后会自动解锁? Google透露了pthread_mutex_timedlock(),但这并不完全相同。

2 个答案:

答案 0 :(得分:1)

如何在共享(和互斥覆盖的)内存中设置最后一次总线访问的时间戳?每次写入都不会像这样:

  1. lock mutex
  2. 检查上次访问的时间戳;如果您的等待时间尚未过去,请暂时休息,因为您无论如何都无法在此线程中执行任何其他操作
  3. 做写
  4. 更新上次访问的时间戳
  5. 解锁互斥锁

答案 1 :(得分:1)

如果遇到这个问题,我可能会使用另一个'APIwrite'线程与驱动程序进行交互。该线程将循环生成器 - 消费者队列弹出和休眠(几百毫秒)。任何其他希望写入的线程只是排队* writeBuffer。 writeBuffer结构可以包含APIwrite线程在写入后将调用的函数(* writeBuffer)指针。由起始线程提供的此功能可以是 发信号通知原始线程正在等待的事件,或者只是释放* writeBuffer。

使用显式互斥锁,定时器等来消除混乱,并允许同步或异步写入。