cha32.线程取消
读书笔记
带参宏
从作用域的角度上看,带参宏和函数的区别:
- 函数有新的函数栈,而带参宏没有,因而带参宏在不同作用域调用时,会受到作用域的影响。如在宏A中的定义的变量,也会影响后续。
- 如果一对作用相反的带参宏,如本节的
pthread_cleanup_push
和pthread_cleanup_pop
,很多实现都是使用带参宏,那么这两个宏调用时必须属于同一个代码块
?,保证push的作用域包含pop不就好了吗
线程取消
线程取消状态可设置为启用和禁用。
- 若启用,则可以取消,但何时响应未知,依赖于取消类型
- 若禁用,将取消请求挂起,直到允许取消
线程取消类型
-
延迟取消,直到取消点(某些特定的系统调用或库函数,如cond_wait等
-
异步取消,随时都可以取消
- 包括malloc,free执行过程中,若在这些函数中取消,则很有可能会导致后续内存分配的过程出现错误。
- 异步取消线程不应该分配资源,(那么是否可以在分配,释放内存时暂时禁止取消,或在计算密集任务开始时设置为异步,结束后恢复?)
- 适用于计算密集型,长时间没有取消点的情况。
-
可以手动产生取消点
pthread_testcancel()
,若调用前已经有了取消请求,则线程会终止