c - 从当前线程中找出事件线程的状态。 (稳健互斥体的实现)

标签 c pthreads mutex

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

我们尝试使用 pthread_mutex_trylock 让等待队列中的线程不阻塞。我们需要一些方法来查明作为互斥锁所有者的线程是否还活着。如何从调用线程获取该线程的状态?

提前致谢, 阿迪亚。

最佳答案

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

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

稳健的互斥体的正确实现确实需要内核的帮助来避免竞争条件。当然,您可以使用令人讨厌的缓慢技术,其中每个锁定和解锁操作都需要一个系统调用来模拟系统上的强大互斥锁,而没有适当的类似 futex 的强大互斥锁支持,例如使用 fcntl 锁定或 SysV 信号量,它们都具有可以实现自动和原子解锁所有者注册的语义...

关于c - 从当前线程中找出事件线程的状态。 (稳健互斥体的实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440996/

相关文章:

c - Pthread 参数

c++ - 如何在C程序中测量时间(以毫秒为单位)

linux - 未使用的 pthread 互斥锁或条件变量分配哪些资源?

C++ 像从另一个线程一样锁定互斥量?

parking 模拟的C程序没有给出输出

c - 创建房间的结构,然后将每个房间写入各自的唯一文件

c++ - 在 linux 上的 C/C++ 中,如何创建预锁定的互斥体

c++ - 为什么无法创建堆栈大小小于默认大小的线程?

c - LCD基址

c - 将字符串传递给函数并返回结构