Man pages关于exit()线程安全性的表述冲突问题问询
问题解答
你对man pages的理解偏差核心是没有注意到POSIX线程安全规则的适用范围:
- POSIX在
man 7 pthreads里约定的「所有标准函数必须线程安全、仅列出的例外除外」的规则,仅适用于调用完成后进程可以正常继续运行的常规功能函数。exit()的定位是终止整个进程的特殊函数,调用后会直接执行全进程的资源销毁流程,最终整个进程都会被内核回收,不存在「调用结束后其他线程还能正常运行、后续操作不受影响」的场景,标准制定阶段就没有把它纳入需要校验线程安全的函数范畴,自然也不会出现在非线程安全例外列表中。 man 3 exit标注的线程不安全,是实际实现层面的风险提示:如果多个线程并发调用exit(),或者某个线程调用exit()的同时其他线程还在操作全局进程资源(比如写入文件、修改全局变量、调用其他依赖全局状态的函数),会出现不可预期的竞态问题:比如exit()已经销毁了某全局资源,其他线程还在访问就会触发段错误,或者多次并发调用exit()会重复执行atexit()注册的退出钩子导致异常。- 额外补充:如果仅需要终止当前线程、不影响整个进程的其他线程运行,应该调用
pthread_exit()而非exit(),pthread_exit()是符合POSIX线程安全要求的函数。
内容的提问来源于stack exchange,提问作者champ_RL_
相关产品推荐
相关产品推荐

