我试图在linux中使用健壮的基于futex的pthread mutex,因为我需要既快速又健壮(恢复“死”锁)。如何检查Linux系统上的pthread mutex库是否基于健壮的Futex?
谢谢!

最佳答案

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

08-26 16:21