Linux 如何检查pthread_互斥体是否基于健壮的futex

Linux 如何检查pthread_互斥体是否基于健壮的futex,linux,pthreads,mutex,futex,Linux,Pthreads,Mutex,Futex,我试图在Linux中使用基于futex的健壮pthread互斥锁,因为我需要既快速又健壮(恢复“死”锁)。如何检查任何Linux系统上的pthread mutex库是否基于健壮的futex 谢谢 如果您有futex(2)系统调用,并且如果使用了它(只是strace(1)一个使用互斥锁的10行应用程序),那么您就有了健壮的特性,因为futex(2)系统调用只有在内核内置健壮性之后才进入内核。这并不意味着你正在使用健壮的Futex,只是你在内核中有这个特性 接下来,您想知道您的libc是否支持它。2

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


谢谢

如果您有
futex(2)
系统调用,并且如果使用了它(只是
strace(1)
一个使用互斥锁的10行应用程序),那么您就有了健壮的特性,因为
futex(2)
系统调用只有在内核内置健壮性之后才进入内核。这并不意味着你正在使用健壮的Futex,只是你在内核中有这个特性

接下来,您想知道您的libc是否支持它。2.9以上的任何版本都支持它。检查一下你的版本

如果您正在编写一个多线程应用程序,那么您并不真正需要Futex的健壮性,因为您可以控制线程,并且可以确保线程在死之前释放它们使用的互斥体,或者注册一个清理函数来执行锁释放(有一个pthread api)。如果您仍然担心,请参阅下面我关于使用健壮互斥体的说明

我只想说清楚,如果你想在多线程应用程序中使用健壮的Futex,你将在性能上付出代价。健壮Futex的主要用途是将其用作多进程应用程序中的同步原语,在多进程应用程序中,一个组件死亡而不杀死其余组件的可能性很高,而在多线程应用程序中,线程异常死亡意味着整个应用程序的死亡

要在多线程或多进程应用程序中使用健壮的Futex,需要使用未记录的函数
pthread\u mutexattr\u setrobust(3)
将Futex标记为健壮。我已经向手册页面维护人员提交了一份错误报告,以添加有关该功能的文档。您需要向该函数传递
PTHREAD\u MUTEX\u ROBUST
,而不是默认的
PTHREAD\u MUTEX\u STALLED

在多线程应用程序中,只需将互斥体标记为健壮

要在多进程应用程序中使用健壮的futex,还需要通过调用函数
pthread\u mutexattr\u setpshared(3)
并将
pthread\u process\u shared
传递给futex,将futex标记为跨进程共享。这与默认的
PTHREAD\u PROCESS\u PRIVATE
相反

实际上,在
strace(1)
中,您不会看到锁的获取和释放,但如果您的futex是健壮的,您将看到调用
set\u robust\u list(2)


我希望这会有所帮助。

如果您有死锁,用livelock替换它会让事情变得更糟。不,所谓“死”锁,我的意思是持有互斥锁的进程崩溃了。在新版本的手册页中,pthread_mutexattr_getrobust函数现在已经有了正确的文档记录。