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