P线程在互斥锁的中间死亡

Pthreads dying in the middle of a mutex lock

本文关键字:中间 线程      更新时间:2023-10-16

当pthread运行时,我想到了以下场景:

pthread_mutex_lock(...);
... // <- Thread dies here
pthread_mutex_unlock(...);

换句话说,pthread启动了,在某个时刻它锁定了一个互斥,并且由于某种原因,它在能够调用匹配的解锁函数之前就死了,要么是因为另一个线程杀死了它,要么是操作系统本身(在这种情况下是安卓系统)决定出于某种原因需要杀死它(它需要做其他事情,等等)

如果你不调用pthread_kill()或类似的东西,这种情况会在android(或任何其他操作系统)上发生吗?即使你调用了,避免这种事情发生的正确方法是什么?非常感谢。

杀死线程从来都不是很有用。(除非您无论如何都能负担得起SIGKILL/中止整个过程)。

相反,在出现异常的情况下展开堆栈,并使用RAII。如果你的进程/操作系统变得如此不稳定,以至于发生了随机线程中止,我认为你会有其他担忧,由此造成的混乱不是进程的责任。

只是不要pthread_kill

此外,当使用进程间同步原语时,所有这些可能会变得稍微有趣一些。然而,在这种情况下,我认为Linux内核保证当进程终止时,该进程所持有的任何锁都会被释放,无论是什么原因

如果线程真的被杀死了,那么我认为任何事情都无济于事。(永远不要扼杀你的线程。)

但还有另一种可能性:可能是您的代码生成的异常,但您没有捕捉到。如果是这样的话,那么你必须:(1)在解锁之前捕获所有异常,或者更好(2)创建一个互斥锁保护类(因为你标记为C++),将互斥锁锁定在其构造函数中,并在析构函数中解锁,并在你想被互斥锁的任何作用域中定义这个类的对象(这是一种异常安全的方法),但如果有什么东西杀死了线程,这不会有帮助。