gpt4 book ai didi

c - 有什么方法可以锁定互斥量并让它在给定时间后自动解锁?

转载 作者:可可西里 更新时间:2023-11-01 11:49:51 24 4
gpt4 key购买 nike

这是在 Linux 上,但理想情况下我想要一个 POSIX 兼容的解决方案。

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

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

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

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

是否有一个 API 调用可以锁定互斥量,但在给定的超时后自动将其解锁? Google 揭示了 pthread_mutex_timedlock(),但这并不是一回事。

最佳答案

我不知道有任何允许自动释放锁的 pthreads API。

我个人会尝试通过单个线程串行化访问总线以避免这些复杂情况。如果该线程维护一个输入队列并且其他线程将它们的请求发布到它,那么它可以执行它希望的任何序列化和冲突解决,这也使得在进一步访问之前实现延迟更容易。只要您注意不要在此线程中使用任何阻塞函数,您唯一真正的失败案例就是它可能被意外终止。

如果你需要从总线读取和写入,你可以给每个线程一个输入队列,让工作线程向 IO 线程发送一个“读取请求”,然后等待响应被发送回它自己的输入队列。如果一个线程只有一个未完成的请求,那么您真的不需要队列,一个简单的 condition variable和指向要填充的结构的指针可能会正常工作。

如果您确实希望两个线程共享资源,那么我认为您将始终面临互斥锁被锁定的风险。即使您设置了一个计时器并在固定时间后强行释放互斥量,这也可能只会导致不同的错误,即线程继续使用资源并认为它拥有锁,而实际上它完全由另一个线程持有。最终,您要尝试针对 future 的编程错误制定稳健性计划,这是一个很好的目标,但也有一个限制 - 互斥锁只是您必须小心处理的东西。

如果您必须采用互斥锁路线,我建议您最好的方法是简单地最小化需要互斥锁的代码并避免阻塞其中的调用。如果您正在实现状态机,请尝试确保互斥体不必在状态转换之间保持锁定状态。如果可能的话,确定互斥锁的范围,以便它们仅在调用链中某个级别的单个函数调用期间保持 - 这使得通过眼睛发现锁定/解锁不匹配变得容易得多。如果您使用的是 C++,则使用 RAII使解锁更加可靠。

但再一次,我认为您会发现以某种方式序列化您的请求会容易得多,通常是通过将一个线程声明为仲裁者(现有线程之一或新线程)。

关于c - 有什么方法可以锁定互斥量并让它在给定时间后自动解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com