避免异步终止线程
16.5 ID_asynchronousTermination
资源的使用情况在异步过程中是难以掌控的,异步终止线程往往会导致泄漏或死锁等严重问题。
示例:
void* foo(void* param) {
pthread_setcanceltype(
PTHREAD_CANCEL_ASYNCHRONOUS, .... // Non-compliant
);
.... // Allocate or lock
}
void bar() {
pthread_t thd;
pthread_create(&thd, NULL, foo, NULL);
....
pthread_cancel(thd); // Non-compliant, leak or deadlock
}
以 pthread 线程库为例,foo 和 bar 是两个相关的异步过程,foo 通过 PTHREAD_CANCEL_ASYNCHRONOUS 指定其线程可以随时被终止,bar 调用 pthread_cancel 终止 foo 线程,在一个过程中暴力终止另一个过程是非常危险的,会使锁、信号量或动态分配的资源无法释放。
PTHREAD_CANCEL_ASYNCHRONOUS 等选项、TerminateThread 等 Windows API,以及具有相同功能的选项或 API 均不应使用,应使线程主动执行清理并正常结束执行。