pthread健壮的互斥锁有多安全?

叶夫根尼

我正在考虑使用Posix健壮的互斥锁来保护不同进程之间的共享资源(在Linux上)。但是,在不同情况下对安全性存在一些疑问。我有以下问题:

  1. 是否在内核或用户代码中实现了强大的互斥锁?

  2. 如果是后者,则在调用pthread_mutex_lock或pthread_mutex_unlock时以及共享的pthread_mutex数据结构正在更新时,如果进程崩溃导致崩溃怎么办?

    我了解,如果一个进程锁定了互斥锁和死亡,则另一个进程中的线程将被唤醒并返回EOWNERDEAD。但是,如果进程(在不太可能的情况下)恰好在更新pthread_mutex数据结构(在共享内存中)时死掉了,将会发生什么情况?在这种情况下,互斥体会损坏吗?如果调用pthread_mutex函数,映射到同一共享内存的另一个进程会发生什么情况?在这种情况下,仍然可以恢复互斥锁吗?

  3. 此问题适用于具有PTHREAD_PROCESS_SHARED属性的任何pthread对象。从不同进程对同一对象同时调用pthread_mutex_lock,pthread_mutex_unlock,pthread_cond_signal等函数是否安全?它们在不同进程之间是线程安全的吗?

看到

从pthread的手册页中:

 Over time, two threading implementations have been provided by the
   GNU C library on Linux:

   LinuxThreads
          This is the original Pthreads implementation.  Since glibc
          2.4, this implementation is no longer supported.

   NPTL (Native POSIX Threads Library)
          This is the modern Pthreads implementation.  By comparison
          with LinuxThreads, NPTL provides closer conformance to the
          requirements of the POSIX.1 specification and better
          performance when creating large numbers of threads.  NPTL is
          available since glibc 2.3.2, and requires features that are
          present in the Linux 2.6 kernel.

   Both of these are so-called 1:1 implementations, meaning that each
   thread maps to a kernel scheduling entity.  Both threading
   implementations employ the Linux clone(2) system call.  In NPTL,
   thread synchronization primitives (mutexes, thread joining, and so
   on) are implemented using the Linux futex(2) system call.

来自man futex(7):

   In its bare form, a futex is an aligned integer which is touched only
   by atomic assembler instructions.  Processes can share this integer
   using mmap(2), via shared memory segments or because they share
   memory space, in which case the application is commonly called
   multithreaded.

此处找到其他备注

(以防万一您想知道它们如何在共享内存中工作:Futex会根据其物理地址进行加密

总而言之,Linux决定在其“本机”futex原语之上实现pthread,而这些原语确实存在于用户进程地址空间中。对于共享同步原语,这将是共享内存,并且在一个进程终止后,其他进程仍将能够看到它。

在流程终止的情况下会发生什么?Ingo Molnar就此发表了一篇名为《Robust Futexes》的文章相关报价:

健壮的飞鹰

但是有一种可能的竞赛:由于在glibc获取了futex之后完成了从列表中添加和删除列表的工作,因此线程(或进程)在那里死了,留下了一些指令窗口,使futex挂起了。为了防止这种情况的发生,用户空间(glibc)还维护了一个简单的每个线程的“ list_op_pending”字段,以允许内核在线程在获取锁之后死掉之前(但可能在将自身添加到列表中之前)清理掉。Glibc会在尝试获取futex之前设置此list_op_pending字段,并在list-add(或list-remove)完成后清除它


概要

这为您带来了其他平台的无限开放空间。可以肯定地说,至少Linux实施已非常小心地满足了我们对健壮性的常识性期望。

看到其他操作系统通常首先使用基于内核的同步原语,我认为它们的实现自然更健壮。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有pthread和互斥锁的OpenCV

来自分类Dev

共享内存中健壮的互斥锁不那么健壮

来自分类Dev

pthread条件变量和互斥锁,程序有死锁

来自分类Dev

pthread条件变量和互斥锁,程序有死锁

来自分类Dev

使用互斥锁的 pthread 同步

来自分类Dev

固有与互斥锁

来自分类Dev

在C中使用互斥锁同步pthread

来自分类Dev

pthread:使用超时锁定互斥锁

来自分类Dev

pthread互斥锁的必要性

来自分类Dev

pthread互斥锁(解锁)锁定不同的线程

来自分类Dev

如何正确处置pthread互斥锁?

来自分类Dev

在C中使用互斥锁同步pthread

来自分类Dev

pthread 互斥锁中的意外行为

来自分类Dev

如何获取pthread中锁定的互斥锁的拥有线程的线程ID

来自分类Dev

在pthread_cond_broadcast之后,哪个线程拥有关联的互斥锁?

来自分类Dev

pthread_mutex_t 的向量为所有互斥锁提供了相同的地址

来自分类Dev

长时间锁定互斥锁是否安全?

来自分类Dev

带有互斥锁的 getter 和 setter 什么时候是线程安全的?

来自分类Dev

C pthread互斥锁:“ {”之前的期望表达式

来自分类Dev

什么是pthread_mutex **的“默认互斥锁属性” **

来自分类Dev

Linux pthread互斥锁和内核调度程序

来自分类Dev

互斥锁与C ++ 11中的pthread兼容吗?

来自分类Dev

语句中使用的pthread互斥锁锁定变量

来自分类Dev

锁定互斥锁时的Pthread优先级

来自分类Dev

Linux pthread互斥锁和内核调度程序

来自分类Dev

什么是pthread_mutex **的“默认互斥锁属性”

来自分类Dev

如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/ CPU?

来自分类Dev

如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/ CPU?

来自分类Dev

确保函数线程安全:特定于线程的数据与互斥锁

Related 相关文章

  1. 1

    带有pthread和互斥锁的OpenCV

  2. 2

    共享内存中健壮的互斥锁不那么健壮

  3. 3

    pthread条件变量和互斥锁,程序有死锁

  4. 4

    pthread条件变量和互斥锁,程序有死锁

  5. 5

    使用互斥锁的 pthread 同步

  6. 6

    固有与互斥锁

  7. 7

    在C中使用互斥锁同步pthread

  8. 8

    pthread:使用超时锁定互斥锁

  9. 9

    pthread互斥锁的必要性

  10. 10

    pthread互斥锁(解锁)锁定不同的线程

  11. 11

    如何正确处置pthread互斥锁?

  12. 12

    在C中使用互斥锁同步pthread

  13. 13

    pthread 互斥锁中的意外行为

  14. 14

    如何获取pthread中锁定的互斥锁的拥有线程的线程ID

  15. 15

    在pthread_cond_broadcast之后,哪个线程拥有关联的互斥锁?

  16. 16

    pthread_mutex_t 的向量为所有互斥锁提供了相同的地址

  17. 17

    长时间锁定互斥锁是否安全?

  18. 18

    带有互斥锁的 getter 和 setter 什么时候是线程安全的?

  19. 19

    C pthread互斥锁:“ {”之前的期望表达式

  20. 20

    什么是pthread_mutex **的“默认互斥锁属性” **

  21. 21

    Linux pthread互斥锁和内核调度程序

  22. 22

    互斥锁与C ++ 11中的pthread兼容吗?

  23. 23

    语句中使用的pthread互斥锁锁定变量

  24. 24

    锁定互斥锁时的Pthread优先级

  25. 25

    Linux pthread互斥锁和内核调度程序

  26. 26

    什么是pthread_mutex **的“默认互斥锁属性”

  27. 27

    如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/ CPU?

  28. 28

    如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/ CPU?

  29. 29

    确保函数线程安全:特定于线程的数据与互斥锁

热门标签

归档