P线程在互斥锁的中间死亡
Pthreads dying in the middle of a mutex lock
当pthread运行时,我想到了以下场景:
pthread_mutex_lock(...);
... // <- Thread dies here
pthread_mutex_unlock(...);
换句话说,pthread启动了,在某个时刻它锁定了一个互斥,并且由于某种原因,它在能够调用匹配的解锁函数之前就死了,要么是因为另一个线程杀死了它,要么是操作系统本身(在这种情况下是安卓系统)决定出于某种原因需要杀死它(它需要做其他事情,等等)
如果你不调用pthread_kill()或类似的东西,这种情况会在android(或任何其他操作系统)上发生吗?即使你调用了,避免这种事情发生的正确方法是什么?非常感谢。
杀死线程从来都不是很有用。(除非您无论如何都能负担得起SIGKILL/中止整个过程)。
相反,在出现异常的情况下展开堆栈,并使用RAII。如果你的进程/操作系统变得如此不稳定,以至于发生了随机线程中止,我认为你会有其他担忧,由此造成的混乱不是进程的责任。
只是不要pthread_kill
此外,当使用进程间同步原语时,所有这些可能会变得稍微有趣一些。然而,在这种情况下,我认为Linux内核保证当进程终止时,该进程所持有的任何锁都会被释放,无论是什么原因
如果线程真的被杀死了,那么我认为任何事情都无济于事。(永远不要扼杀你的线程。)
但还有另一种可能性:可能是您的代码生成的异常,但您没有捕捉到。如果是这样的话,那么你必须:(1)在解锁之前捕获所有异常,或者更好(2)创建一个互斥锁保护类(因为你标记为C++),将互斥锁锁定在其构造函数中,并在析构函数中解锁,并在你想被互斥锁的任何作用域中定义这个类的对象(这是一种异常安全的方法),但如果有什么东西杀死了线程,这不会有帮助。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 当进程结束时,处于Sleep()中间的线程会发生什么
- 线程在循环的中间随机停止
- 中间值和线程安全
- P线程在互斥锁的中间死亡