我不知道任何允许自动释放锁的 pthreads API。
就个人而言,我会尝试通过单个线程序列化对总线的访问,以避免这些并发症。如果该线程维护一个输入队列并且其他线程将它们的请求发布到它,那么它可以执行它希望的任何序列化和冲突解决,这也使得在进一步访问之前实现延迟变得更容易。只要您小心不要在此线程中使用任何阻塞函数,您唯一真正的失败情况就是它可能会意外终止。
如果您需要从总线读取和写入,您可以给每个线程一个输入队列,并让工作线程向 IO 线程发布一个“读取请求”,然后等待响应被发送回它自己的输入队列。如果一个线程只有一个未完成的请求,那么你真的不需要队列,一个简单的条件变量和一个指向要填充的结构的指针可能工作得很好。
如果您确实希望两个线程共享资源,那么我认为您总是会有互斥锁被锁定的风险。即使您设置了一个计时器并在固定时间后强制释放互斥锁,这也可能会导致不同的错误,即一个线程继续使用资源,认为它拥有锁,而实际上它完全由另一个线程持有。最终,您正在尝试针对未来的编程错误计划稳健性,这是一个很好的目标,但有一个限制 - 互斥锁只是一个必须小心的东西。
如果您必须使用互斥锁,我建议您最好的方法是简单地最小化需要互斥锁的代码并避免阻塞其中的调用。如果您正在实现状态机,请尝试确保互斥锁不必在状态转换之间保持锁定状态。如果可能的话,确定您的互斥锁的范围,以便它们仅在调用链中某个级别的单个函数调用期间保持 - 这使得通过肉眼发现锁定/解锁不匹配变得容易得多。如果您使用的是 C++,那么使用RAII使您的锁释放更加可靠。
但是再一次,我认为您会发现以某种方式序列化您的请求会容易得多,通常是通过将一个线程声明为仲裁器(现有线程之一或新线程之一)。