我正在尝试在Linux中使用强大的基于futex的pthread互斥锁,因为我需要既快速又健壮(恢复“死”锁)。如何检查任何Linux系统上的pthread互斥库是否基于强健的futex?
谢谢!
答案 0 :(得分:3)
如果您进行了futex(2)
系统调用,并且使用了它(仅strace(1)
使用互斥锁的10行应用程序),那么您将拥有仅futex(2)
系统调用的强大功能在内置健壮性后进入内核。这样做不意味着你正在使用健壮的futexes,只是你在内核中有这个功能。
接下来你想知道你的libc支持它。任何高于2.9的版本都支持它。只需检查您的版本。
如果您正在编写一个多线程应用程序,那么您实际上并不需要futex的健壮性,因为您控制线程并且可以确保线程在它们死之前释放它们使用的互斥锁或者注册清理函数来执行锁释放(有一个pthread api)。如果您仍然担心,请参阅下面的说明,无论如何都要使用强大的互斥锁。
我只是想说清楚&如果您想在多线程应用程序中使用健壮的futex,请明确表示您将支付性能。强健futexes的主要用途是将它们用作多进程应用程序中的同步原语,其中一个组件死亡而不杀死其余组件的机会高于多线程应用程序中相同的机会,其中异常死亡线程意味着整个应用程序的死亡。
要在多线程或多进程应用程序中使用健壮的futex,您需要使用未记录的函数pthread_mutexattr_setrobust(3)
将futex标记为健壮。我已经向手册页维护者提交了一个错误报告,以添加有关该功能的文档。您需要将PTHREAD_MUTEX_ROBUST
传递给该函数,而不是默认的PTHREAD_MUTEX_STALLED
。
在一个多线程应用程序中,只需要将互斥锁标记为健壮,就可以了。
要在多进程应用程序中使用健壮的futex,您还需要通过调用(幸运记录的)函数pthread_mutexattr_setpshared(3)
并将PTHREAD_PROCESS_SHARED
传递给它来将futex标记为跨进程共享。这与默认的PTHREAD_PROCESS_PRIVATE
相反。
实际上在strace(1)
中你不会看到锁定的获取和释放,但如果你的futex很强大,你会看到set_robust_list(2)
的调用。
我希望这会有所帮助。