Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从当前线程中查找活动线程的状态。(健壮互斥锁的实现)_C_Pthreads_Mutex - Fatal编程技术网

C 从当前线程中查找活动线程的状态。(健壮互斥锁的实现)

C 从当前线程中查找活动线程的状态。(健壮互斥锁的实现),c,pthreads,mutex,C,Pthreads,Mutex,我们正在尝试将一些代码从Solaris移植到HPUX。Solaris使用自己的线程API,HPUX使用Pthread API。我们在迁移过程中面临的一个问题是,在HPUX上没有实现健壮的互斥体,因为不需要实现它来保持POSIX兼容 我们尝试使用pthread\u mutex\u trylock使等待队列中的线程不阻塞。我们需要一些方法来确定作为互斥对象所有者的线程是否处于活动状态。如何从调用线程获取该线程的状态 提前谢谢你, 再见 通常,您无法判断哪些线程拥有互斥体,更不用说它是否处于活动状态

我们正在尝试将一些代码从Solaris移植到HPUX。Solaris使用自己的线程API,HPUX使用Pthread API。我们在迁移过程中面临的一个问题是,在HPUX上没有实现健壮的互斥体,因为不需要实现它来保持POSIX兼容

我们尝试使用pthread\u mutex\u trylock使等待队列中的线程不阻塞。我们需要一些方法来确定作为互斥对象所有者的线程是否处于活动状态。如何从调用线程获取该线程的状态

提前谢谢你,
再见

通常,您无法判断哪些线程拥有互斥体,更不用说它是否处于活动状态

如果您想知道这些信息,那么您必须自己存储它——锁定互斥锁后立即将线程ID存储在某个位置,然后在解锁互斥锁之前清除该值。这些存储必须是原子的,或者由互斥体本身保护(显然,如果使用互斥体,则无法检查该互斥体是否存在问题,否则将出现递归问题)。然后可以使用存储的线程ID检查线程是否处于活动状态

这假设(a)您的线程不会在获取互斥和设置所有者之间死亡,(b)线程ID不会被重用。它还掩盖了“检查线程是否处于活动状态”这一部分——这本身并不微不足道


如果您假设线程可能在任何时候死亡,那么在没有操作系统支持的情况下构建“健壮的互斥体”是不可能的。

不幸的是,Anthony的方法有多种竞争条件:

  • 线程获取互斥体和将自身存储为所有者之间有一段时间间隔。如果另一个线程在trylock失败并希望检查所有者,它可能会发现所有者仍然未写入。在这种情况下,它可以等待,希望所有者写出自己的身份,但如果所有者在正确(错误)的时刻去世,等待将陷入僵局
  • 任何与互斥锁一起存储的所有者标识符都可以在所有者死亡后重新分配。请注意,只存储一个线程id是无用的,因为线程id在进程之间不是唯一的,而健壮的互斥语义仅对进程共享互斥有意义。(在单个进程中,您可以完全控制线程终止;它们不能不可预测地终止,因此您可以让线程正确清理并在退出时释放互斥体。)如果您使用的是PID,唯一可以避免重新分配PID的情况是,该进程是您自己的子进程,并且您还没有等待它

  • 健壮互斥体的正确实现确实需要内核的帮助来避免竞争条件。当然,您可以使用非常慢的技术,其中每个锁定和解锁操作都需要一个系统调用来模拟系统上的健壮互斥,而不需要像futex那样的健壮互斥支持,例如使用
    fcntl
    locking或SysV信号量,两者都有语义,通过语义可以实现自动和原子解锁所有者注册…

    但是保护线程ID的互斥体将需要自己的线程ID。。。一路上都是大象@尼莫:还有更深层次的问题。看我的答案。+1个有趣的问题。我认为最好的答案是“你不能有效地解决问题”,但我试着提供一些理由和潜在的(低效的)解决办法。