c++ - posix 中的健壮 rwlock

标签 c++ c pthreads posix

Posix 提供了一种将互斥锁标记为“稳健”的机制,允许多进程系统从持有互斥锁的进程崩溃中正常恢复。

pthread_mutexattr_setrobust(&mutexattr, PTHREAD_MUTEX_ROBUST);

http://man7.org/linux/man-pages/man3/pthread_mutexattr_setrobust.3.html

但是,似乎没有 rwlock(读写器锁)的等价物。

进程如何在持有 rwlock 的情况下从崩溃中正常恢复?

最佳答案

由于“并发读者”属性,实现健壮的 rwlock 实际上非常困难 - 具有有限存储但无限数量的并发读者的 rwlock 从根本上无法跟踪其读者是谁,因此如果知道当前读者是谁是要保留(为了在读者死亡时减少当前读取锁定计数),它必须是读者任务本身,而不是 rwlock,他们知道他们对它的所有权。我没有看到任何明显的方法可以将它构建在健壮的互斥体之上,或者建立在通常用于实现健壮的互斥体的底层机制(如 Linux 上的 robust_list)之上。

如果你真的需要健壮的 rwlock 语义,你可能最好有某种协议(protocol)和一个假定不会死的专用协调进程,它通过关闭管道/套接字来跟踪客户端的死亡,并且能够通过共享内存内容判断死掉的进程是否持有读锁。请注意,这仍然涉及实现您自己的 rwlock。

关于c++ - posix 中的健壮 rwlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51956715/

相关文章:

c++ - 设置boost文件系统

c++ - 如何使用 Zstd 压缩 C++ 字符串?

c - 为什么我在这个程序中没有看到多线程带来的任何加速?

c++ - 具有多个模板参数的模板容器与具有不同模板参数的其他模板容器交互

c++ - 如何为变量分配一个新对象

c - 为什么 pthread_create() 返回 12?

c++ - 宏替换,-E 选项 gcc

c - 多个子进程将使用 popen 执行的 unix 命令的结果写入父进程

c - 多线程应用程序中的段错误和不正确的输出

C++ - Pthread 如何发送值