gpt4 book ai didi

linux - 如何检查 pthread_mutex 是否基于健壮的 futex

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:25 26 4
gpt4 key购买 nike

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

谢谢!

最佳答案

如果你有 futex(2) 系统调用并且使用它(只是 strace(1) 一个使用互斥锁的 10 行应用程序)那么你有futex(2) 系统调用只有在健壮性被构建到内核后才进入内核。这意味着您正在使用强大的 futexes,只是您在内核中拥有该功能。

接下来您想知道您的 libc 是否支持它。任何高于 2.9 的版本都支持它。只需检查您的版本即可。

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

我只是想明确说明,如果您想在多线程应用程序中使用健壮的 futexes,您将付出性能代价。健壮的 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) 的调用。

希望对您有所帮助。

关于linux - 如何检查 pthread_mutex 是否基于健壮的 futex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com