英文:
PROCESS_SHARED/ROBUST pthread_mutex_t dealocks instead of returning EOWNERDEAD
问题
在我的情况下,我需要在共享内存中使用一些锁,所以我使用了pthread_mutex_t对象。
每个pthread_mutex_t将如下初始化,以便可以在进程之间共享,并且在持有锁的情况下退出进程后可以还原。
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST);
pthread_mutex_init(&m_lock, &attr);
我尝试通过以下步骤触发pthread_mutex_lock返回EOWNERDEAD情况:
- 启动一个进程并在共享内存中创建一个pthread_mutex_t,如上所述。
- 明确在shm中使用pthread_mutex_lock锁定并退出进程。
- 启动另一个进程,获取shm中的锁,并尝试使用pthread_mutex_lock再次锁定。
问题是,我在步骤3中观察到了死锁,即pthread_mutex_lock永远不会返回。
但根据pthread mutex文档中的说明,在这种情况下,pthread_mutex_lock应该返回EOWNERDEAD,表示持有锁的进程在持有锁的情况下退出。
测试环境如下:
- 5.15.0-1033-aws Ubuntu 20.04 LTS
- g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
英文:
In my case, I need some lock in shm so I used pthread_mutex_t object.
Each pthread_mutex_t will be initialized as below so it can be shared between processes and is able to retore if the process exits while holding it.
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST);
pthread_mutex_init(&m_lock, &attr);
I tried to trigger the pthread_mutex_lock returns EOWNERDEAD case through steps below:
- Start one process and create one pthread_mutex_t in shm as described above;
- pthread_mutex_lock the lock in shm explicitly and exit the process;
- Start another process, get the lock in shm and try to lock it again with pthread_mutex_lock;
The issue is that I observed in step 3 deadlock, i.e. the pthread_mutex_lock never returns.
But according to pthread mutex document, in this case the pthread_mutex_lock should return EOWNERDEAD, indicating the holding process exitted while holding the process.
Test env is :
- 5.15.0-1033-aws Ubuntu 20.04 LTS
- g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
答案1
得分: 0
经过调查,我发现在共享内存中的鲁棒互斥锁仅在持有锁的进程/线程以异常
方式退出时才标记为不一致。
当进程通过exit(0)或主函数成功返回时正常退出时,shm中的锁处于一致的锁定状态,因此会导致下一个锁操作永远阻塞。
英文:
After investigation, I found the robust mutex in shm is only marked as inconsistent when holding process/thread exits abnormally
.
When the process exits normally through exit(0) or main function returns successfully, the lock in shm is in consistent locked status, hence causes the next lock operation blocks forever.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论