C 从当前线程中查找活动线程的状态。(健壮互斥锁的实现)
我们正在尝试将一些代码从Solaris移植到HPUX。Solaris使用自己的线程API,HPUX使用Pthread API。我们在迁移过程中面临的一个问题是,在HPUX上没有实现健壮的互斥体,因为不需要实现它来保持POSIX兼容 我们尝试使用pthread\u mutex\u trylock使等待队列中的线程不阻塞。我们需要一些方法来确定作为互斥对象所有者的线程是否处于活动状态。如何从调用线程获取该线程的状态 提前谢谢你,C 从当前线程中查找活动线程的状态。(健壮互斥锁的实现),c,pthreads,mutex,C,Pthreads,Mutex,我们正在尝试将一些代码从Solaris移植到HPUX。Solaris使用自己的线程API,HPUX使用Pthread API。我们在迁移过程中面临的一个问题是,在HPUX上没有实现健壮的互斥体,因为不需要实现它来保持POSIX兼容 我们尝试使用pthread\u mutex\u trylock使等待队列中的线程不阻塞。我们需要一些方法来确定作为互斥对象所有者的线程是否处于活动状态。如何从调用线程获取该线程的状态 提前谢谢你, 再见 通常,您无法判断哪些线程拥有互斥体,更不用说它是否处于活动状态
再见 通常,您无法判断哪些线程拥有互斥体,更不用说它是否处于活动状态 如果您想知道这些信息,那么您必须自己存储它——锁定互斥锁后立即将线程ID存储在某个位置,然后在解锁互斥锁之前清除该值。这些存储必须是原子的,或者由互斥体本身保护(显然,如果使用互斥体,则无法检查该互斥体是否存在问题,否则将出现递归问题)。然后可以使用存储的线程ID检查线程是否处于活动状态 这假设(a)您的线程不会在获取互斥和设置所有者之间死亡,(b)线程ID不会被重用。它还掩盖了“检查线程是否处于活动状态”这一部分——这本身并不微不足道
如果您假设线程可能在任何时候死亡,那么在没有操作系统支持的情况下构建“健壮的互斥体”是不可能的。不幸的是,Anthony的方法有多种竞争条件:
健壮互斥体的正确实现确实需要内核的帮助来避免竞争条件。当然,您可以使用非常慢的技术,其中每个锁定和解锁操作都需要一个系统调用来模拟系统上的健壮互斥,而不需要像futex那样的健壮互斥支持,例如使用
fcntl
locking或SysV信号量,两者都有语义,通过语义可以实现自动和原子解锁所有者注册…但是保护线程ID的互斥体将需要自己的线程ID。。。一路上都是大象@尼莫:还有更深层次的问题。看我的答案。+1个有趣的问题。我认为最好的答案是“你不能有效地解决问题”,但我试着提供一些理由和潜在的(低效的)解决办法。